programmation Java (école d'ingénieur) · Chapitre 15 · Exercice de TD
Arrêter un fil proprement
Threads · niveau 2
Énoncé
Un fil « travailleur » tourne dans une boucle while (continuer) ; le fil principal attend une demi-seconde, puis met continuer à false et attend la fin du travailleur. Écrire ce programme. Pourquoi la variable continuer doit-elle être volatile ? Que peut-il se passer sinon ?
Corrigé
public class Arret {
private static volatile boolean continuer = true;
public static void main(String[] args) throws InterruptedException {
Thread travailleur = new Thread(() -> {
long tours = 0;
while (continuer) tours++; // relit continuer à chaque tour
System.out.println("Arrêté proprement");
});
travailleur.start();
Thread.sleep(500);
continuer = false; // visible par l'autre fil grâce à volatile
travailleur.join();
System.out.println("Fin du main");
}
}
Arrêté proprement
Fin du main
Sans volatile, le compilateur à la volée de la JVM a le droit de lire continuer une seule fois et de transformer la boucle en boucle infinie : le travailleur ne voit jamais le changement, et le programme ne s'arrête pas. Ici l'atomicité n'est pas en cause (une seule écriture d'un booléen) : seule la visibilité compte, et c'est exactement ce que garantit volatile.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.