Thread
fil (flot d'exécution).
Besoin
Permettre l'exécution de tâches parallèles au sein d'un
même processus.
Conception
Des threads sont caractérisés par :
- un nom
- une pile d'exécution
En dehors de ces données particulières, ils partagent tout le
reste, c'est-à-dire les divers élements composants du processus
dans lequel ils s'exécutent, comme :
- ses descripteurs de fichier
- sa mémoire
Ils peuvent donc :
- travailler sur des données communes : peut alors
se poser le problème de modifications concurrentes sur les mêmes
données (que se passe-t-il si 2 threads modifient en même temps
les noms et prénoms d'une personne et qu'un 3ème tente de lire
ces noms et prénoms ? Ce dernier lira-t-il des informations cohérentes
ou mélangées ?). Lorsqu'une structure de données (un
objet typiquement) contrôle ses accès afin de garantir sa cohérence
malgré les accès concurrent, on dit qu'elle est thread-safe.
- communiquer entre eux (s'attendre, se donner des rendez-vous,
etc.).
Implémentation
En Java la gestion des threads est intégrée à la plate-forme.
Un thread est représenté par la classe java.lang.Thread
Il y a deux manière de créer ses propres threads :
- héritage : créer une spécialisation
de la classe Thread et la démarrer.
- délégation : créer et démarrer
un thread en lui fournissant la tâche (java.lang.Runnable)
qu'il devra exécuter.
Un thread peut prendre un verrou exclusif (monitor) sur un objet via
:
- le mot-clé synchronized { } qui permet à un thread
de prendre le verrou sur un objet. Il le relâchera lorsqu'il sortira
du bloc synchronisé.
- la méthode wait() de tout objet qui permet à
un thread de relâcher le verrou qu'il a pris sur lui et d'attendre qu'on
lui redonne (via une notification).
- la méthode notify() de tout objet qui permet à
un thread ayant acquis un verrou sur lui de le redonner à qui l'attend
(wait)
Exemples
Des exemples de threads sont :
- le thread d'attente de connexions d'un serveur Web
- un GC
Notes
- Egalement appelés modifieurs (mutators) car ce
sont les seuls objets qui modifient l'état d'autres objets.
- Plus performants que des processus (pas d'allocation mémoire, pas
de basculement de contexte, etc.)
Voir