les threads : introduction java.lang.thread java.lang.runnable
TRANSCRIPT
Les threads : introductionjava.lang.Thread
java.lang.RunnableCours Java - F. Michel
Processes and Threads● Dans la programmation concurrente, il existe
principalement deux unités d'exécution : les processus et les threads.
● L'exécution des processus et des threads est gérée par l'OS (slicing).
● Un processus possède son propre environnement d'exécution (ressources systèmes)
● En général on a un processus par application (mais on peut faire coopérer 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 léger » (lightweight process)
● Les threads existe dans un processus (au moins un thread par processus)
● Les threads nécessitent moins de ressources : ils partagent les ressources du processus père : mémoire, fichiers ouverts, etc.
● L'exécution d'une jvm est « multi-threadée »: les threads constituent un aspect essentiel du langage Java
Exécution « point de vue » utilisateur
instruction
instruction
instruction
instruction
instruction
instruction
t
● En général, le code s'exécute sur un seul fil d'exécution: le « main thread »
● L'ordre dans lequel les instructions sont exécutées est garanti.
● Il n'est pas possible de faire des choses « en parallèle »
Exécution multi-threadée
instruction Thread1
t
instruction Thread1
instruction Thread1
instruction Thread1
instruction Thread2
instruction Thread2
● Chaque thread possède son code à exécuter
● L'ordre global dans lequel les instructions sont exécutées n'est pas garanti.
● Il est possible de faire des choses « en parallèle »
Le « main » thread
Autres threads de la jvm
java.lang.Thread
java.lang.Thread
java.lang.Thread.State
java.lang.Thread
● Première manière de créer un nouveau thread : étendre la classe Thread
● Le code à exécuter doit être implémenté dans la méthode public void run() (héritée : surcharge)
● La méthode start() héritée de la classe démarre le thread
Créer un nouveau thread (1)
java.lang.Runnable
● Deuxième manière de créer un nouveau thread : créer un objet qui implémente l'interface Runnable
● Le code à exécuter doit être implémenté dans la méthode public void run() (obligatoire)
● On passe l'objet en paramètre du constructeur d'un thread
Créer un nouveau thread (2)
La méthode static sleep
La méthode static sleep
Comment stopper un thread ?
● Automatiquement :– Un thread se termine de lui même lorsqu'il n'y a
plus rien à exécuter dans la méthode run
● Manuellement :– depuis le thread courant (ou depuis un autre
thread) en utilisant la méthode interrupt() sur l'instance visée (cf. Javadoc)
● Mais cela ne suffit pas...
Comment stopper un thread ?
● Que faire pour savoir si le thread a été interrompu si les méthodes utilisées ne renvoient pas d'exception du type InterruptedException ?
● Il faut régulièrement tester si le thread n'a pas été interrompu.
Synchronisation de threads
● La méthode join() appliquée sur un objet t de type Thread permet d'attendre la fin de l'exécution de t :
● t.join(); // attendre la fin de t
Manipulation de données partagées
Manipulation de données partagéesSoient 2 threads A et B, avec c=0 dans la classe Counter,
si A invoque increment au « même moment » que B invoque decrement, on peut avoir la séquence d'actions suivante :
1. Thread A: accède c → valeur 0.
2. Thread B: accède c → valeur 0.
3. Thread A: Incrémente la valeur accédée → 1.
4. Thread B: Décrémente la valeur accédée → -1.
5. Thread A: Enregistre le résultat dans c → c = 1.
6. Thread B: Enregistre le résultat dans c → c = - 1.
Le calcul de A est perdu !!
Méthodes synchronisées
● Avec le mot clé synchronized :
Méthodes synchronisées
● Lorsqu'une méthode synchronisée est invoquée par un thread :
– Aucune autre méthode synchronisée de l'objet ne peut être invoquée avant la fin de l'exécution de ce thread : l'objet est « locked ».
– Tous les changements effectués seront visibles par les autres threads (relation de précédence)
Synchronisation d'instructions
Objet locké
Synchronisation d'instructions
Accès atomiques
● Certaines instructions sont atomiques, i.e. sont exécutées entièrement par un thread en une seule fois.
– Attention : i++ n'est pas une instruction atomique (lecture + écriture)
– La lecture et l'écriture des références et des types primitifs sont atomiques (sauf long et double)
– La lecture et l'écriture des variables déclarées comme volatile (mot clé java, e.g. private) sont atomiques (attention : toujours pas i++)
Programmation concurrentedepuis 1.5
● Java 1.5 a introduit de nouveaux packages :
– Java.util.concurrent (gestion de threads et de structures de données adaptées)
– Java.util.concurrent.atomic (variables thread safe)
– Java.util.concurrent.locks (conditions personnalisées)
Package java.util.concurrent
Package java.util.concurrent.atomic
java.util.concurrent.locks