Académique Documents
Professionnel Documents
Culture Documents
Runnable
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
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
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
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
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
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
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)
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 :
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
Mthodes synchronises
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++)
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