thread java

25
Les Threads Enseignante: Chiraz El Hog Amri Auditoire: FIA1 ISSAT Année Universitaire: 2012-2013

Upload: seghaierbechir

Post on 13-Dec-2014

41 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Thread Java

Les Threads

Enseignante: Chiraz El Hog Amri

Auditoire: FIA1

ISSAT

Année Universitaire: 2012-2013

Page 2: Thread Java

Introduction� Programme séquentiel: exécution séquentielle des instructions

� Attendre la fin d’exécution de la première instruction pour pouvoir lancer la deuxième

� Impossible de traiter deux instructions à la fois

� Un programme est multitâche quand il lance (ou peut lancer) � Un programme est multitâche quand il lance (ou peut lancer) l’exécution de plusieurs parties de son code en même temps� A un moment donné, il comporte plusieurs points d’exécution

liés aux différentes parties qui s'exécutent en parallèle

� Tous les systèmes d’exploitation modernes sont multitâches et ils permettent l’exécution de programmes multitâches

2

Page 3: Thread Java

Introduction� Le multitâche s’appuie sur la notion de threads (fil

d’exécution en français)

� Un processus peut lancer plusieurs threads qui se partagent le même espace mémoire ; ils peuvent accéder aux mêmes variablesvariables

� Un thread prend moins de ressources système qu’un processus (processus léger)

� les Threads ne s'exécutent pas en même temps mais en temps partagé, c'est pour cette raison qu'il est important pour un Thread de toujours laisser une chance aux autres de s'exécuter.

3

Page 4: Thread Java

Exemples de thread

� L’interface graphique avec l’utilisateur lance un thread pour charger une image pour continuer à traiter les événements générés par les actions de l’utilisateurl’utilisateur

� Le serveur réseau qui attend les demandes de connexions venant des autres machines lance un thread pour traiter chacune des demandes

� S'adresser de manière personnelle à plusieurs clients simultanément comme les serveurs HTTP ou les Chat.

4

Page 5: Thread Java

Cycle de vie d’un thread

� Etat nouveau: C'est l'état initial après l'instanciation du Thread. Le Thread est opérationnel mais n'est pas encore actif

� Etat exécutable: A partir du moment où il a été lancé par la méthode start() et le reste tant qu'il n'est pas sorti de la méthode start() et le reste tant qu'il n'est pas sorti de la méthode run(). Dès que le système le pourra, il donnera du temps d'exécution au Thread

� Etat en attente ou éligible pour l’exécution: n'exécute aucun traitement et ne consomme aucune ressource CPU

� Etat Bloqué: Donnant la main à d’autres Thread

� Etat mort: Un Thread dans un état mort est un Thread qui est sorti de sa méthode run() soit de manière naturelle, soit de manière subite (Exception non interceptée) 5

Page 6: Thread Java

6

Page 7: Thread Java

Programmation des Threads

� Il y a deux façons de créer un Thread� Implémenter l’interfacejava.lang.Runnable: Utiliser le

constructeur Thread(Runnable) de la classe Threadconstructeur Thread(Runnable) de la classe Thread

1. créer un Runnable (le code qui sera exécuté par le thread)

2. le passer au constructeur de Thread

� Créer une instance d’une classe fille de java.lang.Thread: Utiliser le constructeur sans paramètres. La classe fille doit redéfinir la méthode run()

7

Page 8: Thread Java

Méthode1: l’interface Runnable

8

Page 9: Thread Java

Méthode2: classe fille de la classe Thread

9

Page 10: Thread Java

Quelle méthode utiliser?

� Si on a une super classe, on est obligé de choisir la 1ère méthode (Thread(Runnable)): cas des applets

� Il est aussi plus simple d’utiliser la 1ère méthode � Il est aussi plus simple d’utiliser la 1ère méthode pour partager des données entre plusieurs threads

� Sinon, l’écriture du code est (légèrement) plus simple en utilisant la 2ème méthode

10

Page 11: Thread Java

Synchronisation entre threads

� L’utilisation de threads peut entraîner des besoins de synchronisation pour éviter les problèmes liés aux accès simultanés aux variablesaux accès simultanés aux variables

� En programmation, on appelle section critique une partie du code qui ne peut être exécutée en même temps par plusieurs threads sans risquer de provoquer des anomalies de fonctionnement

11

Page 12: Thread Java

Exemple de problème

� Si x = 2, le code x = x + 1; exécuté par 2 threads, peut donner en fin d’exécution 3 ou 4 suivant l’ordre d’exécution :

1. T1 : lit la valeur de x (2)1. T1 : lit la valeur de x (2)

2. T2 : lit la valeur de x (2)

3. T1 : calcul de x + 1 (3)

4. T2 : calcul de x + 1 (3)

5. T1 : range la valeur calculée dans x (3)

6. T2 : range la valeur calculée dans x (3)

� x contient 3 au lieu de 4 !12

Page 13: Thread Java

Synchronisation

� Il faut donc éviter l’exécution simultanée de sections de code critiques par plusieurs threads

� En Java le code synchronisé sur un objet est utilisé � En Java le code synchronisé sur un objet est utilisé pour synchroniser les threads et les empêcher d’exécuter en même temps des portions de code

� Plusieurs threads ne peuvent exécuter en même temps du code synchronisé sur un même objet

13

Page 14: Thread Java

2 possibilités pour synchroniserdu code sur un objet o

� Méthode synchronisée m (avec un message envoyé à l’objet o : o.m(…)) :

public synchronized int m(…) { . . }

� Bloc synchronisé sur l’objet o :

14

synchronized(o) {// le code synchronisé. . .

}

public synchronized int m(…) { . . }

Page 15: Thread Java

Exemple

15

Page 16: Thread Java

Exemple� On lance 3 threads du type suivant :

� A la fin de l’exécution, on n’obtient pas nécessairement 300.000

� Pour éviter ce problème il faut rendre deposersynchronisée :

16

Page 17: Thread Java

Exemple

17

Page 18: Thread Java

Coordination des Threads

� Lorsqu’un programme est multi-tâche, la situation suivante peut se rencontrer :� Un thread t1 ne peut continuer son exécution que si une � Un thread t1 ne peut continuer son exécution que si une

condition est remplie

� Le fait que la condition soit remplie ou non dépend d’un autre thread t2

� Par exemple, t1 a besoin du résultat d’un calcul effectué par t2

18

Page 19: Thread Java

Coordination des Threads

� Une solution coûteuse serait que t1 teste la condition à intervalles réguliers

� Les méthodes wait() et notify () de la classe Object � Les méthodes wait() et notify () de la classe Object permettent de programmer plus efficacement ce genre de situation

19

Page 20: Thread Java

Coordination des Threads

� Cette utilisation demande un travail coopératif entre les threads t1 et t2 :

1. Ils se mettent d’accord sur un objet commun objet1. Ils se mettent d’accord sur un objet commun objet

2. Arrivé à l’endroit où il ne peut continuer que si la condition est remplie, t1 se met en attente objet.wait();

3. Quand t2 a effectué le travail pour que la condition soit remplie, il le notifie :

objet.notify(); ce qui débloque t120

Page 21: Thread Java

Méthode Wait()

� public final void wait() throws InterruptedException

� objet.wait()

nécessite que le thread en cours possède le nécessite que le thread en cours possède le moniteur de objet

bloque le thread qui l’appelle, jusqu’à ce qu’un autre thread appelle la méthode objet.notify() ou objet.notifyAll()

libère le moniteur de l’objet (l’opération « blocage du thread – libération du moniteur » est atomique)

21

Page 22: Thread Java

Méthode notifyAll()

� public final void notifyAll()

� objet.notifyAll()� nécessite que le thread en cours possède le moniteur de � nécessite que le thread en cours possède le moniteur de

objet� débloque tous les threads qui s’étaient bloqués sur

l’objet avec objet.wait()

22

Page 23: Thread Java

Exemple

23

Page 24: Thread Java

Exemple

24

Page 25: Thread Java

Exemple

25