Vous êtes sur la page 1sur 33

Les threads : introduction java.lang.Thread java.lang.

Runnable

Cours Java - F. Michel

Processes and Threads

Dans la programmation concurrente, il existe principalement deux units d'excution : les processus et les threads. L'excution des processus et des threads est gre par l'OS (slicing). Un processus possde son propre environnement d'excution (ressources systmes) En gnral on a un processus par application (mais on peut faire cooprer des processus (IPC : Inter Process Communication) La plupart des JVM tourne sur un seul processus

Processes and Threads

Un thread est souvent appel un processus lger (lightweight process) Les threads existe dans un processus (au moins un thread par processus) Les threads ncessitent moins de ressources : ils partagent les ressources du processus pre : mmoire, fichiers ouverts, etc. L'excution d'une jvm est multi-threade : les threads constituent un aspect essentiel du langage Java

Excution point de vue utilisateur

En gnral, le code s'excute sur un seul fil d'excution: le main thread L'ordre dans lequel les instructions sont excutes est garanti. Il n'est pas possible de faire des choses en parallle

instruction instruction instruction instruction instruction instruction

Excution multi-threade

Chaque thread possde son code excuter L'ordre global dans lequel les instructions sont excutes n'est pas garanti. Il est possible de faire des choses en parallle

instruction Thread1 instruction Thread2 instruction Thread1 instruction Thread1 instruction Thread2 instruction Thread1

Le main thread

Autres threads de la jvm

java.lang.Thread

java.lang.Thread

java.lang.Thread.State

java.lang.Thread

Premire manire de crer un nouveau thread : tendre la classe Thread Le code excuter doit tre implment dans la mthode public void run() (hrite : surcharge) La mthode start() hrite de la classe dmarre le thread

Crer un nouveau thread (1)

java.lang.Runnable

Deuxime manire de crer un nouveau thread : crer un objet qui implmente l'interface Runnable Le code excuter doit tre implment dans la mthode public void run() (obligatoire) On passe l'objet en paramtre du constructeur d'un thread

Crer un nouveau thread (2)

La mthode static sleep

La mthode static sleep

Comment stopper un thread ?

Automatiquement :

Un thread se termine de lui mme lorsqu'il n'y a plus rien excuter dans la mthode run

Manuellement :

depuis le thread courant (ou depuis un autre thread) en utilisant la mthode interrupt() sur l'instance vise (cf. Javadoc)

Mais cela ne suffit pas...

Comment stopper un thread ?

Que faire pour savoir si le thread a t interrompu si les mthodes utilises ne renvoient pas d'exception du type InterruptedException ? Il faut rgulirement tester si le thread n'a pas t interrompu.

Synchronisation de threads

La mthode join() applique sur un objet t de type Thread permet d'attendre la fin de l'excution de t :

t.join(); // attendre la fin de t

Manipulation de donnes partages

Manipulation de donnes partages


Soient 2 threads A et B, avec c=0 dans la classe Counter, si A invoque increment au mme moment que B invoque decrement, on peut avoir la squence d'actions suivante :

1. Thread A: accde c valeur 0. 2. Thread B: accde c valeur 0. 3. Thread A: Incrmente la valeur accde 1. 4. Thread B: Dcrmente la valeur accde -1. 5. Thread A: Enregistre le rsultat dans c c = 1. 6. Thread B: Enregistre le rsultat dans c c = - 1. Le calcul de A est perdu !!

Mthodes synchronises

Avec le mot cl synchronized :

Mthodes synchronises

Lorsqu'une mthode synchronise est invoque par un thread :

Aucune autre mthode synchronise de l'objet ne peut tre invoque avant la fin de l'excution de ce thread : l'objet est locked . Tous les changements effectus seront visibles par les autres threads (relation de prcdence)

Synchronisation d'instructions

Objet lock

Synchronisation d'instructions

Accs atomiques

Certaines instructions sont atomiques, i.e. sont excutes entirement par un thread en une seule fois.

Attention : i++ n'est pas une instruction atomique (lecture + criture) La lecture et l'criture des rfrences et des types primitifs sont atomiques (sauf long et double) La lecture et l'criture des variables dclares comme volatile (mot cl java, e.g. private) sont atomiques (attention : toujours pas i++)

Programmation concurrente depuis 1.5

Java 1.5 a introduit de nouveaux packages :

Java.util.concurrent (gestion de threads et de structures de donnes adaptes) Java.util.concurrent.atomic (variables thread safe) Java.util.concurrent.locks (conditions personnalises)

Package java.util.concurrent

Package java.util.concurrent.atomic

java.util.concurrent.locks