Вы находитесь на странице: 1из 21

NFP 121

Java et les Threads

Prsentation : Thierry Escalarasse

Mai 2007

Plan du cour
Prsentation de la notion de Threads La classe Thread Linterface Runnable Les tats dun thread La Synchronisation

Introduction la notion de Thread

Introduction aux Threads


Dans la programmation que nous avons vu jusqu aujourdhui, les programmes suivaient de manire squentielle les instructions du programme. Limites : Si un programme est en train de traiter des donner, il ne peut pas faire la mise jour dune barre de dfilement. Linterface utilisateur peut tre gele le temps du traitement, ou par exemple lcoute des boutons mise en attente. Pour palier ces problmes, lide est davoir plusieurs fils dexcution. Ces fils d excution sappellent les Threads.

Introduction aux Threads

Programme
Thread Principal

Thread

Cration dun thread

Fin du thread

Introduction aux Threads


Chaque thread possde :

Un tat dexcution Sa propre pile Un espace ddi des variables propres au thread Laccs aux variables du processus Laccs aux ressources du processus (exemple : accs un fichier ouvert par un autre thread du mme processus).

Processus
Thread 1
Ressources, Donnes

Thread 2

Introduction aux Threads


Simultanit physique : ceci est possible sur des machines multi-processeurs. Lexcution de deux threads est rpartie sur 2 processeurs. Simultanit logique : chaque thread sexcute un moment donn, le processeur permute rapidement l excution de chacun donnant une illusion de simultanit

Thread 1

Thread 1

Thread 1

Thread 1

Thread 1

Thread 1

Thread 1

Thread 1

Introduction aux Threads


Les threads sont parfois appels processus lgers Multithreading : permet une simultanit dans un contexte de processus unique

Avantages du multithreading par rapport aux processus : partage plus efficace des ressources communes moins de surcharge au niveau du processeur Les threads sont au cur mme de Java et de la machine virtuelle : tout programme Java est excut en tant que Thread de la machine virtuelle. (Garbage collector, thread principal, pile des vnements graphique)

La classe Thread

La classe Thread
Package : java.lang La classe java.lang.Thread implmente le mcanisme permettant la cration dun nouveau fil dexcution. Mise en uvre : Faire driver la classe de java.lang.Thread Puis fournir un point dentre au nouveau thread en surchargeant la mthode run() Appel de la mthode start(), sur une instance drivant de Thread, afin de crer le nouveau fil dexcution.
Class C extends Thread { public C { // } public void run() { // } }

La classe Thread
Exercice : Crer une classe ClasseThreadee, drivant de Thread, ayant pour fonction dcrire sur la sortie standard son nom, ainsi quun compteur.( de 1 100 000 par exemple) Depuis une classe part, crer 4 objets de ClasseThreadee sexcutant simultanment.

La classe Thread
Avantages Simplicit de mise en uvre Inconvnients Java nautorisant pas lhritage multiple, le fait de driver de Thread apporte certaines contraintes de conception objet. Autre solution pour le multi-threading : utilisation de linterface java.lang.Runnable.

Linterface Runnable

Linterface Runnable
La deuxime approche pour la cration de thread est lutilisation de linterface Runnable. Vous pouvez transformer nimporte quelle classe en Thread, en la faisant implmenter linterface Runnable. Concrtement, cela implique dimplmenter la mthode dentre dans le thread : run().

Class C implements Runnable { public C { // } public void run() { // } }

Linterface Runnable
Comment utiliser lobjet implmentant Runnable pour le faire sexcuter dans un nouveau Thread ? Rponse : on cre un nouvel objet Thread, en passant en argument au constructeur une rfrence lobjet implmentant linterface Runnable

C obj = new C(); Thread nouvThread = new Thread(obj); nouvThread.start();

Linterface Runnable
Exercice : Modifiez le code de lexercice prcdent de sorte utiliser linterface Runnable.

Les tats dun Thread

Les tats dun Thread


Comme nous lavons vu en introduction, la machine virtuelle et le systme allouent des temps dexcution aux threads. On peut dj imaginer que le thread peut tre en cours dexcution , en attente , fini . En fait il existe 4 tats :

En attente

Prt tre excut

En cours dexcution

Mort

Les tats dun Thread


Nous allons prsent nous intresser aux mthodes qui permettent de changer ltat dun thread par programmation. Mthode sleep(long timeInMillisecond) : cette mthode permet de stopper le thread en train de sexcuter pour une priode donne. Si dautres threads sont en tat Prt excuter , le systme autorise lexcution de lun deux. Mthode yield() : laisse lopportunit dautres Threads de sexcuter. Remarque : dune manire gnrale, ds quun thread est en tat dattente demand par programmation, il faut grer les exceptions InterruptedException. La mthode isInterrupted(), permet de savoir si le flag de demande dinterruption a t activ. Nota : ne pas confondre avec la mthode isAlive(), qui elle permet se savoir si le thread en question est encore dans un tat autre que mort .

Les tats dun Thread


Un thread peut se mettre en attente de la fin dun autre thread. Pour cela on utilise la mthode join(). Nota : possibilit de passer un timeout en paramtre. Nota 2 : ici encore, on est en attente demande par programmation, il faudra donc traiter les exceptions de type InterruptedException.

thread1.join(); // Attends la mort de thread1

Les tats dun thread


Complment : les threads possdent des noms. On y accde par setName(), getName(). Lorsquaucun nom na t spcifi, le systme en attribue un par dfaut en utilisant la rgle suivante :

Thread[Compteur]

Вам также может понравиться