Adloun

programmation Java (école d'ingénieur) · Chapitre 15 · Application directe du cours

Prévoir les sorties

Threads · niveau 1 (application)

Énoncé

On considère le programme suivant.


public class Prevoir {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> System.out.print("B"));
        System.out.print("A");
        t.start();
        System.out.print("C");
        t.join();
        System.out.print("D");
    }
}
  • Quelles sont toutes les sorties possibles ?
  • Même question si l'on supprime t.join().
  • Même question si l'on remplace t.start() par t.run() (avec le join).

Corrigé

  • « A » est affiché avant le start, donc en premier. Ensuite « B » (fil t) et « C » (fil principal) sont concurrents, dans un ordre quelconque. Enfin join attend la fin de t : « D » vient en dernier. Deux sorties possibles : ABCD et ACBD. En pratique, sur 200 exécutions, la machine de l'auteur a toujours affiché ACBD : démarrer un fil prend du temps, et le fil principal a celui d'écrire « C ». Mais ABCD reste possible, et un programme qui compterait sur l'un des deux ordres serait faux.
  • Sans join, « D » peut aussi précéder « B » : ABCD, ACBD ou ACDB. « B » finit toujours par s'afficher : le programme attend la fin de tous les fils non démons.
  • run() est un appel ordinaire, exécuté par le fil principal : la sortie est toujours ABCD. Le join sur un thread jamais démarré rend la main immédiatement.

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 →