SlideShare une entreprise Scribd logo
Année 2008-2009


                                Les threads Java

                                  Nicolas Baudru
                       mél : nicolas.baudru@esil.univmed.fr
                  page web : nicolas.baudru.perso.esil.univmed.fr




                                         1
Présentation du problème

Revenons quelques instants à nos animaux.
     public class Chien {
       public void aboyer () {
         // ici se trouve le comportement normal d ' un chien
       }
     }

     public class TestChien {
       public static void main ( String [] args ) {
         Chien c1 = new Chien ();
         Chien c2 = new Chien ();
         c1 . aboyer ();
         c2 . aboyer ();
       }
     }

                 Les deux chiens aboient-ils en même temps ?
                                       2
Multithreading en Java



En java, il est possible de simuler l'exécution de plusieurs programmes  en même
temps . C'est le multithreading. L'exécution de chaque programme est alors
appelé un thread.
Le multithreading est intégré au langage Java. La création de threads est très
simple :
      Thread t = new Thread (); // créer un nouveau thread
      t . start ();
En créant un nouvel objet Thread, vous créez un l d'exécution séparé qui possède
sa propre pile.
                         A votre avis, que fait ce thread ?



                                          3
Tâche d'un thread



En Java le multithreading signie qu'il faut
    créer un thread,
    écrire la tâche exécutée par le thread,
    lier la tâche au thread.

Pour réaliser cela, il faut étudier et comprendre la classe Thread.
       Thread
     void join()
    void start()
 static void sleep()



                                          4
Que signie avoir plusieurs piles d'appels




Avec plusieurs piles d'appels, on a l'impression que plusieurs choses se passent en
même temps. Dans un système multiprocesseurs cela serait réellement possible,
mais pas sur un système monoprocesseur. Il faut donc  faire semblant , ce qui
est rendu possible par les threads.

               A votre avis comment Java peut donner l'impression
                       d'exécuter plusieurs piles d'appels ?




                                          5
Exemple

     public static void main ( String [ ] args ) { // étape 1
       Runnable r = new MaTache ();
       Thread t = new Thread ( r );
       t . start (); // étape 2 : une nouvelle pile est créée
       Chat c = new Chat ();
     }


            thread principal   thread t
Etape 1 :       main()


Etape 2 :        main()         run()
                t.start()

Etape 3 :       main()         run()
                Chien()         go()
                                    6
Comment lancer un nouveau thread
£  
¢1 ¡Créer   un objet Runnable (la tâche du thread) :
     Runnable threadTache = new MonRunnable ();
En fait, Runnable est une interface. Il faut donc écrire une classe implémentant
cette interface et dénissant la tâche que le thread doit exécuter dans une
nouvelle pile. Ici, cette classe est appelée MonRunnable.
£  
¢2 ¡Créer   un objet Thread et lui passer une tâche :
     Thread monThread = new Thread ( threadTache );
On passe l'objet Runnable au constructeur de Thread. Le thread sait ainsi quelle
méthode placer au sommet de la pile : c'est la méthode run() de l'objet Runnable.
£  
¢3 ¡Lancer   le thread :
     monThread . start ();
C'est à ce moment là qu'un nouveau l d'exécution est créé. Une nouvelle pile est
créée avec la méthode run() en son sommet.
                                           7
L'interface Runnable




L'interface Runnable ne dénit qu'une seule méthode : la méthode void run().
Lorsque vous voulez dénir une tâche, il vous sut d'écrire une classe qui
implémente Runnable. Cette classe contient au moins une méthode.
                              Laquelle et pourquoi ?

Ainsi, lorsque vous fournissez à un constructeur de Thread un objet Runnable,
vous lui donnez un moyen d'obtenir une méthode run(). Autrement dit, vous lui
donnez du travail à faire.



                                         8
Exemple



    public class MonRunnable implements Runnable {
      public void run () {  go ();  }
      public void go () {  // faire des choses }
    }

    class TestThread {
      public static void main ( String [] args ) {
        Runnable tache = new MonRunnable ();
        Thread monThread = new Thread ( tache );
        monThread . start ();

            // d ' autres trucs à faire ...
        }
    }




                                    9
Etats des threads
£  
¢1 ¡lethread est nouveau. L'objet est créé mais il n'y a pas encore de l
d'exécution.
         Thread t = new Thread ( r );
£  
¢2 ¡lethread est exécutable. Quand vous lancez le thread, une pile est créée. Le
thread attend alors que la JVM le choisisse an de s'exécuter.
         t . start ;
£  
¢3 ¡lethread est en cours d'exécution. C'est LE thread qui s'exécute, le seul. C'est
l'ordonnanceur de la JVM qui décide quel thread va s'exécuter à un moment
donné. Quand un thread s'exécute les autres sont en attente. A tout moment
l'ordonnanceur peut arrêter l'exécution du thread (il retourne alors dans l'état
exécutable) et en choisir un autre.
£  
¢4 ¡lethread est bloqué. Le thread veut obtenir une ressource (une méthode d'un
objet  verrouillé , le clavier, ...) non disponible pour le moment.
         ex : t . sleep (200);
                                         10
Etats des threads



                                 t5,t7,t1,t4


              nouveau            exécutable




                    t3,t6

                                 en cours
               bloqué                               fin
                                 d'exécution

                                    t2
                            un seul processus ici



                            11
Questions

                  Quel est le résultat du programme suivant ?
    public class MonRunnable implements Runnable {
      public void run () {        go ();  }
      public void go () {
        System . out . println (  monThread  );
      }
    }

    class TestThread {
      public static void main ( String [] args ) {
        Runnable tache = new MonRunnable ();
        Thread monThread = new Thread ( tache );
        monThread . start ();
        System . out . println (  retour à main ()  );
      }
    }

     Peut-on ressusciter un thread mort (i.e. qui a terminé son exécution) ?
                                        12
Endormir un thread

La méthode statique sleep(int d) de la classe Thread force le thread en cours
d'exécution à passer dans l'état bloqué pendant d ms. L'ordonnanceur choisira
alors un autre thread dans la liste des threads exécutables.
    public class MonRunnable implements Runnable {
       public void run () {     go (); }
       public void go () {
         try {
           Thread . sleep (2000);
         } catch ( InterruptedException ex ) {
           ex . printStackTrace ();
         }
         // faire d ' autres trucs
       }
     }

   Au bout de combien de temps un thread bloqué par un appel à sleep va-t-il
                retrouver son état  en cours d'exécution  ?
                                        13
Encore un exemple

    public class MaTache implements Runnable {
      public void run () {
        for ( int i = 0; i  25; i ++) {
          String nom = Thread . currentThread (). getName ();
          System . out . println ( nom +
                        est en cours d ' exécution  );
      }

        public static void main ( String [] args ) {
          Runnable tache = new MaTache ();
          Thread a = new Thread ( tache );
          a . setName (  Caroline  );
          Thread b = new Thread ( tache );
          b . setName (  Cedric  );
          a . start ();
          b . start ();
        }
    }

                         Quel est le résultat ?
                                   14
Le problème de l'accès concurrent




Une situation où deux processus ou plus lisent ou écrivent des données partagées
et où le résultat nal dépend de quel élément s'exécute à un moment donnée est
appelée le problème de l'accès concurrent.
Exemple : voir complément de cours
Il est très dicile de déboguer des programmes contenant des problèmes de
concurrence, car les résultats des tests sont souvent corrects à première vue, mais
de temps en temps il se produit des situations curieuses et inexpliquées.




                                         15
Exclusion mutuelle et sections critiques



Pour éviter les problèmes de ce type de problème, il faut trouver une solution pour
interdire que plusieurs threads lisent et écrivent des données partagées
simultanément.
L'exclusion mutuelle est une méthode qui permet de s'assurer que si un thread
utilise une variable ou un chier partagés, les autres processus seront excluent de
la même activité. Les choix de la mise en oeuvre de l'exclusion mutuelle est une
question de conception majeure pour tout système d'exploitation. Leur étude sort
de la portée de ce cours.
Dans un programme, la partie à partir de laquelle on accède à une ressource
partagée se nomme section critique. Pour éviter les problèmes d'accès concurrent,
il faut empêcher que deux processus se retrouvent simultanément dans leurs
sections critiques.


                                         16
L'exclusion mutuelle en Java : les vérrous




En Java, il est très simple d'empêcher que deux threads exécutent en même temps
une même méthode. Pour cela, il sut d'utiliser le modicateur synchronized sur
la méthode en question.
Le mot clé synchronized signie qu'un thread a besoin d'une clé pour accéder au
code synchronisé.
Pour protéger vos données, vous devez donc protéger les méthodes qui ont une
action sur ces données.




                                       17
Les vérrous et les objets




Tout objet possède un vérrou, et ce vérrou n'a qu'une clé.
Lorsqu'un thread veut entrer dans une méthode synchronisée, il doit obtenir la clé
de l'objet. Si la clé est disponible, i.e. aucun autre thread ne la détient, le thread
prend la clé et entre dans la méthode. Dès lors le thread gardera la clé tant qu'il
n'aura pas terminé la méthode synchronisée.
Si la clé de l'objet n'est pas disponible, aucun thread ne peut entrer dans une
méthode synchronisée de cet objet.
                        Pourquoi ne pas tout synchroniser ?




                                          18
Exemple sans synchronized

    class TestSync implements Runnable {
      private int solde ;

       public void run () {
         for ( int i = 0; i  50; i ++) {
           incrementer ();
           System . out . println (  le solde est de :  + solde );
         } }
       public void incrementer () {
         int i = solde ;
         solde = i + 1;
       } }

    public class TestTestSync {
      public static void main ( String [] args ) {
        TestSync tache = new TestSync ();
        Thread a = new Thread ( tache );
        Thread b = new Thread ( tache );
        a . start ();
        b . start ();
                              19
      } }
Exemple avec synchronized

    class TestSync implements Runnable {
      private int solde ;

       public void run () {
         for ( int i = 0; i  50; i ++) {
           incrementer ();
           System . out . println (  le solde est de :  + solde );
         } }
       public synchronized void incrementer () {
         int i = solde ;
         solde = i + 1;
       } }

    public class TestTestSync {
      public static void main ( String [] args ) {
        TestSync tache = new TestSync ();
        Thread a = new Thread ( tache );
        Thread b = new Thread ( tache );
        a . start ();
        b . start ();
                              20
      } }
synchronisation des threads et deadlock




voir complément de cours.




                                      21

Contenu connexe

Tendances

Exceptions
ExceptionsExceptions
Exceptions
Axel KAMALAK
 
Cours de JAVA de base
Cours de JAVA  de baseCours de JAVA  de base
Cours de JAVA de base
Wiki Info Systeme
 
JAVA Chapitre7
JAVA Chapitre7JAVA Chapitre7
JAVA Chapitre7
Mohamed Ferchichi
 
JAVA Chapitre6
JAVA Chapitre6JAVA Chapitre6
JAVA Chapitre6
Mohamed Ferchichi
 
Introduction a Java
Introduction a JavaIntroduction a Java
Introduction a Java
Wiki Info Systeme
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
Mohamed Ferchichi
 
JAVA Chapitre8
JAVA Chapitre8JAVA Chapitre8
JAVA Chapitre8
Mohamed Ferchichi
 
Concepts de base O.O (1)
Concepts de base O.O (1)Concepts de base O.O (1)
Concepts de base O.O (1)
Ouijden Dhemaid
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
Jean-Michel Doudoux
 
Clonage d'objets
Clonage d'objetsClonage d'objets
Clonage d'objets
MohammedElaminTebib
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
Amir Souissi
 
Initialisation dynamique en c++11 (n2660)
Initialisation dynamique en c++11 (n2660)Initialisation dynamique en c++11 (n2660)
Initialisation dynamique en c++11 (n2660)
Daniel Strul
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
Khalil Lechheb
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
Francois Ostyn
 
TP2 RMI
TP2 RMITP2 RMI
Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
Jean David Olekhnovitch
 
Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5
Mamadou Oury Ba
 
De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()
Lorraine JUG
 

Tendances (19)

Cours java
Cours javaCours java
Cours java
 
Exceptions
ExceptionsExceptions
Exceptions
 
Cours de JAVA de base
Cours de JAVA  de baseCours de JAVA  de base
Cours de JAVA de base
 
JAVA Chapitre7
JAVA Chapitre7JAVA Chapitre7
JAVA Chapitre7
 
JAVA Chapitre6
JAVA Chapitre6JAVA Chapitre6
JAVA Chapitre6
 
Introduction a Java
Introduction a JavaIntroduction a Java
Introduction a Java
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
 
JAVA Chapitre8
JAVA Chapitre8JAVA Chapitre8
JAVA Chapitre8
 
Concepts de base O.O (1)
Concepts de base O.O (1)Concepts de base O.O (1)
Concepts de base O.O (1)
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
 
Clonage d'objets
Clonage d'objetsClonage d'objets
Clonage d'objets
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
Initialisation dynamique en c++11 (n2660)
Initialisation dynamique en c++11 (n2660)Initialisation dynamique en c++11 (n2660)
Initialisation dynamique en c++11 (n2660)
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
TP2 RMI
TP2 RMITP2 RMI
TP2 RMI
 
Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
 
Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5
 
De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()
 

Similaire à Threads

synchronization.pdf
synchronization.pdfsynchronization.pdf
synchronization.pdf
Patiento Del Mar
 
Les Threads.ppt
Les Threads.pptLes Threads.ppt
Les Threads.ppt
hashiramasenju65
 
java_PAR.pdf
java_PAR.pdfjava_PAR.pdf
java_PAR.pdf
Patiento Del Mar
 
threads.pdf
threads.pdfthreads.pdf
threads.pdf
Patiento Del Mar
 
chapitre 2 Android 2.pptx
chapitre 2 Android 2.pptxchapitre 2 Android 2.pptx
Mécanisme de planification de tâches
Mécanisme de planification de tâchesMécanisme de planification de tâches
Mécanisme de planification de tâches
Novencia Groupe
 
12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf
Patiento Del Mar
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
Khalil Lechheb
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
Saber LAJILI
 
POO - Chapitre6.pptx
POO - Chapitre6.pptxPOO - Chapitre6.pptx
POO - Chapitre6.pptx
RAYENBOUAFIF1
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
Fou Cha
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
Thierry Leriche-Dessirier
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
ENSET, Université Hassan II Casablanca
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
Asmaa BENGUEDDACH
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
Jean-Michel Doudoux
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
ECAM Brussels Engineering School
 
Memo java
Memo javaMemo java
Memo java
Ghazouani Mahdi
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
Microsoft
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
Patiento Del Mar
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
Antoine Rey
 

Similaire à Threads (20)

synchronization.pdf
synchronization.pdfsynchronization.pdf
synchronization.pdf
 
Les Threads.ppt
Les Threads.pptLes Threads.ppt
Les Threads.ppt
 
java_PAR.pdf
java_PAR.pdfjava_PAR.pdf
java_PAR.pdf
 
threads.pdf
threads.pdfthreads.pdf
threads.pdf
 
chapitre 2 Android 2.pptx
chapitre 2 Android 2.pptxchapitre 2 Android 2.pptx
chapitre 2 Android 2.pptx
 
Mécanisme de planification de tâches
Mécanisme de planification de tâchesMécanisme de planification de tâches
Mécanisme de planification de tâches
 
12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
POO - Chapitre6.pptx
POO - Chapitre6.pptxPOO - Chapitre6.pptx
POO - Chapitre6.pptx
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Memo java
Memo javaMemo java
Memo java
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 

Threads

  • 1. Année 2008-2009 Les threads Java Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.fr 1
  • 2. Présentation du problème Revenons quelques instants à nos animaux. public class Chien { public void aboyer () { // ici se trouve le comportement normal d ' un chien } } public class TestChien { public static void main ( String [] args ) { Chien c1 = new Chien (); Chien c2 = new Chien (); c1 . aboyer (); c2 . aboyer (); } } Les deux chiens aboient-ils en même temps ? 2
  • 3. Multithreading en Java En java, il est possible de simuler l'exécution de plusieurs programmes en même temps . C'est le multithreading. L'exécution de chaque programme est alors appelé un thread. Le multithreading est intégré au langage Java. La création de threads est très simple : Thread t = new Thread (); // créer un nouveau thread t . start (); En créant un nouvel objet Thread, vous créez un l d'exécution séparé qui possède sa propre pile. A votre avis, que fait ce thread ? 3
  • 4. Tâche d'un thread En Java le multithreading signie qu'il faut créer un thread, écrire la tâche exécutée par le thread, lier la tâche au thread. Pour réaliser cela, il faut étudier et comprendre la classe Thread. Thread void join() void start() static void sleep() 4
  • 5. Que signie avoir plusieurs piles d'appels Avec plusieurs piles d'appels, on a l'impression que plusieurs choses se passent en même temps. Dans un système multiprocesseurs cela serait réellement possible, mais pas sur un système monoprocesseur. Il faut donc faire semblant , ce qui est rendu possible par les threads. A votre avis comment Java peut donner l'impression d'exécuter plusieurs piles d'appels ? 5
  • 6. Exemple public static void main ( String [ ] args ) { // étape 1 Runnable r = new MaTache (); Thread t = new Thread ( r ); t . start (); // étape 2 : une nouvelle pile est créée Chat c = new Chat (); } thread principal thread t Etape 1 : main() Etape 2 : main() run() t.start() Etape 3 : main() run() Chien() go() 6
  • 7. Comment lancer un nouveau thread £   ¢1 ¡Créer un objet Runnable (la tâche du thread) : Runnable threadTache = new MonRunnable (); En fait, Runnable est une interface. Il faut donc écrire une classe implémentant cette interface et dénissant la tâche que le thread doit exécuter dans une nouvelle pile. Ici, cette classe est appelée MonRunnable. £   ¢2 ¡Créer un objet Thread et lui passer une tâche : Thread monThread = new Thread ( threadTache ); On passe l'objet Runnable au constructeur de Thread. Le thread sait ainsi quelle méthode placer au sommet de la pile : c'est la méthode run() de l'objet Runnable. £   ¢3 ¡Lancer le thread : monThread . start (); C'est à ce moment là qu'un nouveau l d'exécution est créé. Une nouvelle pile est créée avec la méthode run() en son sommet. 7
  • 8. L'interface Runnable L'interface Runnable ne dénit qu'une seule méthode : la méthode void run(). Lorsque vous voulez dénir une tâche, il vous sut d'écrire une classe qui implémente Runnable. Cette classe contient au moins une méthode. Laquelle et pourquoi ? Ainsi, lorsque vous fournissez à un constructeur de Thread un objet Runnable, vous lui donnez un moyen d'obtenir une méthode run(). Autrement dit, vous lui donnez du travail à faire. 8
  • 9. Exemple public class MonRunnable implements Runnable { public void run () { go (); } public void go () { // faire des choses } } class TestThread { public static void main ( String [] args ) { Runnable tache = new MonRunnable (); Thread monThread = new Thread ( tache ); monThread . start (); // d ' autres trucs à faire ... } } 9
  • 10. Etats des threads £   ¢1 ¡lethread est nouveau. L'objet est créé mais il n'y a pas encore de l d'exécution. Thread t = new Thread ( r ); £   ¢2 ¡lethread est exécutable. Quand vous lancez le thread, une pile est créée. Le thread attend alors que la JVM le choisisse an de s'exécuter. t . start ; £   ¢3 ¡lethread est en cours d'exécution. C'est LE thread qui s'exécute, le seul. C'est l'ordonnanceur de la JVM qui décide quel thread va s'exécuter à un moment donné. Quand un thread s'exécute les autres sont en attente. A tout moment l'ordonnanceur peut arrêter l'exécution du thread (il retourne alors dans l'état exécutable) et en choisir un autre. £   ¢4 ¡lethread est bloqué. Le thread veut obtenir une ressource (une méthode d'un objet verrouillé , le clavier, ...) non disponible pour le moment. ex : t . sleep (200); 10
  • 11. Etats des threads t5,t7,t1,t4 nouveau exécutable t3,t6 en cours bloqué fin d'exécution t2 un seul processus ici 11
  • 12. Questions Quel est le résultat du programme suivant ? public class MonRunnable implements Runnable { public void run () { go (); } public void go () { System . out . println ( monThread ); } } class TestThread { public static void main ( String [] args ) { Runnable tache = new MonRunnable (); Thread monThread = new Thread ( tache ); monThread . start (); System . out . println ( retour à main () ); } } Peut-on ressusciter un thread mort (i.e. qui a terminé son exécution) ? 12
  • 13. Endormir un thread La méthode statique sleep(int d) de la classe Thread force le thread en cours d'exécution à passer dans l'état bloqué pendant d ms. L'ordonnanceur choisira alors un autre thread dans la liste des threads exécutables. public class MonRunnable implements Runnable { public void run () { go (); } public void go () { try { Thread . sleep (2000); } catch ( InterruptedException ex ) { ex . printStackTrace (); } // faire d ' autres trucs } } Au bout de combien de temps un thread bloqué par un appel à sleep va-t-il retrouver son état en cours d'exécution ? 13
  • 14. Encore un exemple public class MaTache implements Runnable { public void run () { for ( int i = 0; i 25; i ++) { String nom = Thread . currentThread (). getName (); System . out . println ( nom + est en cours d ' exécution ); } public static void main ( String [] args ) { Runnable tache = new MaTache (); Thread a = new Thread ( tache ); a . setName ( Caroline ); Thread b = new Thread ( tache ); b . setName ( Cedric ); a . start (); b . start (); } } Quel est le résultat ? 14
  • 15. Le problème de l'accès concurrent Une situation où deux processus ou plus lisent ou écrivent des données partagées et où le résultat nal dépend de quel élément s'exécute à un moment donnée est appelée le problème de l'accès concurrent. Exemple : voir complément de cours Il est très dicile de déboguer des programmes contenant des problèmes de concurrence, car les résultats des tests sont souvent corrects à première vue, mais de temps en temps il se produit des situations curieuses et inexpliquées. 15
  • 16. Exclusion mutuelle et sections critiques Pour éviter les problèmes de ce type de problème, il faut trouver une solution pour interdire que plusieurs threads lisent et écrivent des données partagées simultanément. L'exclusion mutuelle est une méthode qui permet de s'assurer que si un thread utilise une variable ou un chier partagés, les autres processus seront excluent de la même activité. Les choix de la mise en oeuvre de l'exclusion mutuelle est une question de conception majeure pour tout système d'exploitation. Leur étude sort de la portée de ce cours. Dans un programme, la partie à partir de laquelle on accède à une ressource partagée se nomme section critique. Pour éviter les problèmes d'accès concurrent, il faut empêcher que deux processus se retrouvent simultanément dans leurs sections critiques. 16
  • 17. L'exclusion mutuelle en Java : les vérrous En Java, il est très simple d'empêcher que deux threads exécutent en même temps une même méthode. Pour cela, il sut d'utiliser le modicateur synchronized sur la méthode en question. Le mot clé synchronized signie qu'un thread a besoin d'une clé pour accéder au code synchronisé. Pour protéger vos données, vous devez donc protéger les méthodes qui ont une action sur ces données. 17
  • 18. Les vérrous et les objets Tout objet possède un vérrou, et ce vérrou n'a qu'une clé. Lorsqu'un thread veut entrer dans une méthode synchronisée, il doit obtenir la clé de l'objet. Si la clé est disponible, i.e. aucun autre thread ne la détient, le thread prend la clé et entre dans la méthode. Dès lors le thread gardera la clé tant qu'il n'aura pas terminé la méthode synchronisée. Si la clé de l'objet n'est pas disponible, aucun thread ne peut entrer dans une méthode synchronisée de cet objet. Pourquoi ne pas tout synchroniser ? 18
  • 19. Exemple sans synchronized class TestSync implements Runnable { private int solde ; public void run () { for ( int i = 0; i 50; i ++) { incrementer (); System . out . println ( le solde est de : + solde ); } } public void incrementer () { int i = solde ; solde = i + 1; } } public class TestTestSync { public static void main ( String [] args ) { TestSync tache = new TestSync (); Thread a = new Thread ( tache ); Thread b = new Thread ( tache ); a . start (); b . start (); 19 } }
  • 20. Exemple avec synchronized class TestSync implements Runnable { private int solde ; public void run () { for ( int i = 0; i 50; i ++) { incrementer (); System . out . println ( le solde est de : + solde ); } } public synchronized void incrementer () { int i = solde ; solde = i + 1; } } public class TestTestSync { public static void main ( String [] args ) { TestSync tache = new TestSync (); Thread a = new Thread ( tache ); Thread b = new Thread ( tache ); a . start (); b . start (); 20 } }
  • 21. synchronisation des threads et deadlock voir complément de cours. 21