les threads : introduction java.lang.thread java.lang.runnable

33
Les threads : introduction java.lang.Thread java.lang.Runnable Cours Java - F. Michel

Upload: others

Post on 12-Sep-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Les threads : introduction java.lang.Thread java.lang.Runnable

Les threads : introductionjava.lang.Thread

java.lang.RunnableCours Java - F. Michel

Page 2: Les threads : introduction java.lang.Thread java.lang.Runnable

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

Page 3: Les threads : introduction java.lang.Thread java.lang.Runnable

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

Page 4: Les threads : introduction java.lang.Thread java.lang.Runnable

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 »

Page 5: Les threads : introduction java.lang.Thread java.lang.Runnable

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 »

Page 6: Les threads : introduction java.lang.Thread java.lang.Runnable

Le « main » thread

Page 7: Les threads : introduction java.lang.Thread java.lang.Runnable

Autres threads de la jvm

Page 8: Les threads : introduction java.lang.Thread java.lang.Runnable

java.lang.Thread

Page 9: Les threads : introduction java.lang.Thread java.lang.Runnable

java.lang.Thread

Page 10: Les threads : introduction java.lang.Thread java.lang.Runnable
Page 11: Les threads : introduction java.lang.Thread java.lang.Runnable
Page 12: Les threads : introduction java.lang.Thread java.lang.Runnable
Page 13: Les threads : introduction java.lang.Thread java.lang.Runnable

java.lang.Thread.State

Page 14: Les threads : introduction java.lang.Thread java.lang.Runnable

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

Page 15: Les threads : introduction java.lang.Thread java.lang.Runnable

Créer un nouveau thread (1)

Page 16: Les threads : introduction java.lang.Thread java.lang.Runnable

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

Page 17: Les threads : introduction java.lang.Thread java.lang.Runnable

Créer un nouveau thread (2)

Page 18: Les threads : introduction java.lang.Thread java.lang.Runnable

La méthode static sleep

Page 19: Les threads : introduction java.lang.Thread java.lang.Runnable

La méthode static sleep

Page 20: Les threads : introduction java.lang.Thread java.lang.Runnable

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...

Page 21: Les threads : introduction java.lang.Thread java.lang.Runnable

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.

Page 22: Les threads : introduction java.lang.Thread java.lang.Runnable

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

Page 23: Les threads : introduction java.lang.Thread java.lang.Runnable

Manipulation de données partagées

Page 24: Les threads : introduction java.lang.Thread java.lang.Runnable

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 !!

Page 25: Les threads : introduction java.lang.Thread java.lang.Runnable

Méthodes synchronisées

● Avec le mot clé synchronized :

Page 26: Les threads : introduction java.lang.Thread java.lang.Runnable

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)

Page 27: Les threads : introduction java.lang.Thread java.lang.Runnable

Synchronisation d'instructions

Objet locké

Page 28: Les threads : introduction java.lang.Thread java.lang.Runnable

Synchronisation d'instructions

Page 29: Les threads : introduction java.lang.Thread java.lang.Runnable

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++)

Page 30: Les threads : introduction java.lang.Thread java.lang.Runnable

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)

Page 31: Les threads : introduction java.lang.Thread java.lang.Runnable

Package java.util.concurrent

Page 32: Les threads : introduction java.lang.Thread java.lang.Runnable

Package java.util.concurrent.atomic

Page 33: Les threads : introduction java.lang.Thread java.lang.Runnable

java.util.concurrent.locks