Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →