Révisions

Au choix pour de cette séance

Barrière de threads (interruptions)

On veut faire une barrière de threads. On fixe un nombre n de threads initial. Chaque thread se lance et appelle une méthode waitAt() qui attend que les n threads soient arrivés. Dans ce cas, chaque thread affiche sont numéro. Mais si un des threads est interrompu avant l'arrivée de tous les autres alors il doit interrompre touts les threads en attente ; chaque thread interrompu, y compris lui même doit alors lancer une InterruptedException.

Écrire la classe Gate avec son constructeur et la méthode waitAt pour que l'on puisse l'utiliser avec le code du main suivant.

public class Gate {
  ...

  public static void main(String[] args) {
    var nbThreads = 100;
    var tab = new Thread[nbThreads];

    var barrier = new Gate(nbThreads);

    IntStream.range(0, nbThreads).forEach(i -> {
      tab[i] = Thread.ofPlatform().start(() -> {
        try {
          // Thread.sleep(100);
          barrier.waitAt();
          System.out.print(i + " ");
        } catch (InterruptedException e) {
          return;
        }
      });
    });

    try {
      Thread.sleep(100);
      tab[50].interrupt();
    } catch (InterruptedException e) {
      throw new AssertionError(e);
    }
  }
} 

Supposons que l'on ajoute un appel à Thread.sleep() avant l'appel à barrier.waitAt();. Quels ont les différents scénarios d’exécution possibles ? Vous pouvez tester avec sleep(100), sleep(105), ...