You are on page 1of 25

Les Threads

Enseignante: Chiraz El Hog Amri Auditoire: FIA1 ISSAT


Anne Universitaire: 2012-2013

Introduction
Programme squentiel: excution squentielle des instructions
Attendre la fin dexcution de la premire instruction pour pouvoir lancer la deuxime Impossible de traiter deux instructions la fois

Un programme est multitche quand il lance (ou peut lancer) lexcution de plusieurs parties de son code en mme temps
A un moment donn, il comporte plusieurs points dexcution lis aux diffrentes parties qui s'excutent en parallle Tous les systmes dexploitation modernes sont multitches et ils permettent lexcution de programmes multitches

Introduction
Le multitche sappuie sur la notion de threads (fil dexcution en franais) Un processus peut lancer plusieurs threads qui se partagent le mme espace mmoire ; ils peuvent accder aux mmes variables Un thread prend moins de ressources systme quun processus (processus lger) les Threads ne s'excutent pas en mme 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'excuter.
3

Exemples de thread
Linterface graphique avec lutilisateur lance un thread pour charger une image pour continuer traiter les vnements gnrs par les actions de lutilisateur Le serveur rseau qui attend les demandes de connexions venant des autres machines lance un thread pour traiter chacune des demandes S'adresser de manire personnelle plusieurs clients simultanment comme les serveurs HTTP ou les Chat.
4

Cycle de vie dun thread


Etat nouveau: C'est l'tat initial aprs l'instanciation du Thread. Le Thread est oprationnel mais n'est pas encore actif Etat excutable: A partir du moment o il a t lanc par la mthode start() et le reste tant qu'il n'est pas sorti de la mthode run(). Ds que le systme le pourra, il donnera du temps d'excution au Thread Etat en attente ou ligible pour lexcution: n'excute aucun traitement et ne consomme aucune ressource CPU Etat Bloqu: Donnant la main dautres Thread Etat mort: Un Thread dans un tat mort est un Thread qui est sorti de sa mthode run() soit de manire naturelle, soit de manire subite (Exception non intercepte) 5

Programmation des Threads


Il y a deux faons de crer un Thread
Implmenter linterface java.lang.Runnable: Utiliser le constructeur Thread(Runnable) de la classe Thread crer un Runnable (le code qui sera excut par le thread) le passer au constructeur de Thread Crer une instance dune classe fille de java.lang.Thread: Utiliser le constructeur sans paramtres. La classe fille doit redfinir la mthode run()

1. 2.

Mthode1: linterface Runnable

Mthode2: classe fille de la classe Thread

Quelle mthode utiliser?


Si on a une super classe, on est oblig de choisir la 1re mthode (Thread(Runnable)): cas des applets Il est aussi plus simple dutiliser la 1re mthode pour partager des donnes entre plusieurs threads Sinon, lcriture du code est (lgrement) plus simple en utilisant la 2me mthode

10

Synchronisation entre threads


Lutilisation de threads peut entraner des besoins de synchronisation pour viter les problmes lis aux accs simultans aux variables En programmation, on appelle section critique une partie du code qui ne peut tre excute en mme temps par plusieurs threads sans risquer de provoquer des anomalies de fonctionnement

11

Exemple de problme
Si x = 2, le code x = x + 1; excut par 2 threads, peut donner en fin dexcution 3 ou 4 suivant lordre dexcution : 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 calcule dans x (3) 6. T2 : range la valeur calcule dans x (3) x contient 3 au lieu de 4 !

12

Synchronisation
Il faut donc viter lexcution simultane de sections de code critiques par plusieurs threads En Java le code synchronis sur un objet est utilis pour synchroniser les threads et les empcher dexcuter en mme temps des portions de code Plusieurs threads ne peuvent excuter en mme temps du code synchronis sur un mme objet

13

2 possibilits pour synchroniser du code sur un objet o


Mthode synchronise m (avec un message envoy lobjet o : o.m()) :
public synchronized int m() { . . }

Bloc synchronis sur lobjet o :


synchronized(o) { // le code synchronis ... }
14

Exemple

15

Exemple
On lance 3 threads du type suivant :

A la fin de lexcution, on nobtient pas ncessairement 300.000 Pour viter ce problme il faut rendre deposer synchronise :
16

Exemple

17

Coordination des Threads


Lorsquun programme est multi-tche, la situation suivante peut se rencontrer :
Un thread t1 ne peut continuer son excution que si une condition est remplie Le fait que la condition soit remplie ou non dpend dun autre thread t2

Par exemple, t1 a besoin du rsultat dun calcul effectu par t2

18

Coordination des Threads


Une solution coteuse serait que t1 teste la condition intervalles rguliers Les mthodes wait() et notify() de la classe Object permettent de programmer plus efficacement ce genre de situation

19

Coordination des Threads


Cette utilisation demande un travail coopratif entre les threads t1 et t2 : 1. Ils se mettent daccord sur un objet commun objet 2. Arriv lendroit 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 dbloque t1
20

Mthode Wait()
public final void wait() throws InterruptedException

objet.wait() ncessite que le thread en cours possde le moniteur de objet bloque le thread qui lappelle, jusqu ce quun autre thread appelle la mthode objet.notify() ou objet.notifyAll() libre le moniteur de lobjet (lopration blocage du thread libration du moniteur est atomique)
21

Mthode notifyAll()
public final void notifyAll() objet.notifyAll()
ncessite que le thread en cours possde le moniteur de objet dbloque tous les threads qui staient bloqus sur lobjet avec objet.wait()

22

Exemple

23

Exemple

24

Exemple

25

You might also like