Le verrou est équivalent à une porte. Avant que le verrou n'atteigne l'état final, la porte est toujours fermée et aucun thread ne peut passer. Lorsque l'état final est atteint, la porte s'ouvre et laisse passer tous les threads. Cela peut faire attendre un ou plusieurs threads qu’un ensemble d’événements se produise. L'état de verrouillage consiste en un compteur, initialisé à un nombre formel positif indiquant le nombre d'événements à attendre. La méthode countDown décrémente le compteur, indiquant qu'un événement s'est produit, tandis que la méthode wait attend que le compteur atteigne 0, indiquant que l'événement attendu s'est produit. CountDownLatch souligne qu'un thread (ou plusieurs threads) doit attendre que n autres threads terminent quelque chose avant de continuer à s'exécuter.
Application du scénario :
10 athlètes se préparent à courir, ils attendent l'ordre de l'arbitre et commencent à courir en même temps. Lorsque la dernière personne franchit la ligne d'arrivée, le jeu se termine. 10 mouvements équivalent à 10 threads. La clé ici est de contrôler 10 threads à exécuter en même temps et de déterminer quand le dernier thread a atteint le point final. Deux verrous peuvent être utilisés. Le premier verrou sert à contrôler 10 fils en attente de l'ordre de l'arbitre, et le deuxième verrou contrôle la fin du jeu.
import java.util.concurrent.CountDownLatch ; classe Aworker implémente Runnable { private int num ; private CountDownLatch end ; public Aworker (int num, final CountDownLatch end) { this.num = num ; = start; this.end = end; } @Override public void run() { // TODO Stub de méthode généré automatiquement { System.out.println(num + "la ème personne est prête"); start.await(); //Ready} catch (InterruptedException e) { e.printStackTrace( } enfin { end.countDown(); le compteur diminue de un et atteint le point final System.out.println(num + "ème personnes arrivent"); } }} public class Race { public static void main(String[] args) { int num = 10; CountDownLatch start = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, start, end)).start() ; } try { Thread.sleep((long) (Math.random() * 5000)); catch (InterruptedException e1) { // TODO Bloc de capture généré automatiquement e1.printStackTrace(); } System.out.println("le juge dit : cours !"); start.countDown(); ); try { end.await(); //Attendez la fin} catch (InterruptedException e) { // TODO Bloc catch généré automatiquement e.printStackTrace( } enfin { long endTime = System.nanoTime(); System.out.println("le juge dit : tout est arrivé !" System.out.println("passer du temps : " + (endTime - startTime));
sortir
1ème personne est prête2ème personne est prête4ème personne est prête6ème personne est prête3ème personne est prête10ème personne est prête8ème personne est prête5ème personne est prête7ème personne est prête9ème personne est prêtejuge dit : cours !1ème personne arrive4ème personne arrive10ème personne arrive5ème personne arrive2ème personne arrivejuge dit : tous sont arrivés !9ème personne arrive7ème personne arrive8ème personne arrive3ème personne arrive6ème personne arrivetemps: 970933