Les instructions de compte à rebours sont pour votre référence. Le contenu spécifique est le suivant
CountdownLatch est un package java.util.concurrent Next Synchronisation Tool Class qui permet à un ou plusieurs threads d'attendre qu'un ensemble d'opérations soit terminé dans d'autres threads.
L'utilisation de CountdownLatch est très simple. L'exemple suivant est également ce que j'ai vu en ligne, et il est très approprié. Je le posterai ici.
Classe publique Test {public static void main (String [] args) {CountdownLatch begin = new CountdownLatch (1); CountdownLatch end = nouveau compte à rebours (2); pour (int i = 0; i <2; i ++) {thread thread = new Thread (nouveau lecteur (begin, end)); thread.start (); } essayez {System.out.println ("La course commence"); Begin.CountDown (); end.Await (); System.out.println ("The Race End"); } catch (exception e) {e.printStackTrace (); }}} / ** * lecteur * / classe Lecteur implémente Runnable {private CountdownLatch begin; Tendal privé à compte à rebours privé; Player (CountdownLatch Begin, CountdownLatch end) {this.begin = begin; this.end = end; } public void run () {try {begin.Await (); System.out.println (thread.currentThread (). GetName () + "Arrivée!") ;; end.CountDown (); } catch (InterruptedException e) {e.printStackTrace (); }}}Voici les résultats en cours d'exécution
Vous pouvez voir que grâce à l'utilisation de CountdownLatch, nous contrôlons l'ordre d'exécution des threads.
Dans le code ci-dessus, nous utilisons la méthode Await () et la méthode à rebours (). Vérifions leurs fonctions respectives.
Vérifiez d'abord la méthode Await (). Commentez la fin.Await () dans la méthode principale. Ce qui suit est le résultat de l'exécution après avoir commenté.
Vous pouvez voir que le fil principal n'a pas attendu que le fil représentant le concurrent se termine, et a directement annoncé que la compétition était terminée! Le jeu qui s'est terminé au début ---
On peut voir ici que la méthode Await () a un effet de blocage
Deuxièmement, vérifions la méthode du compte à rebours et commentez la fin.CountDown () dans le fil du concurrent. Ce qui suit est le résultat en cours d'exécution.
Le programme est en cours d'exécution et tous les joueurs ont atteint la ligne d'arrivée, mais l'arbitre ne fait tout simplement pas la fin du jeu. Qu'attend-il?
Nous supposons que la méthode à rebours () a pour effet de réveiller le fil de blocage.
Ensuite, nous pouvons demander, puisqu'il a la fonction de réveiller le fil de blocage, n'est-il pas possible de réveiller le thread principal bloqué que si nous n'appelons la méthode du compte à rebours () qu'une seule fois?
Essayons-le, inconditionnel l'annotation coutdown () ci-dessus, créez à nouveau un joueur, le code est le suivant
Class Player2 implémente Runnable {private CountdownLatch Begin; Tendal privé à compte à rebours privé; Player2 (CountdownLatch Begin, CountdownLatch end) {this.begin = begin; this.end = end; } public void run () {try {begin.Await (); System.out.println (thread.currentThread (). GetName () + "Arrivée!"); // end.CountDown (); } catch (InterruptedException e) {e.printStackTrace (); }}}La méthode principale est également modifiée comme suit, créant deux joueurs différents
public static void main (String [] args) {CountdownLatch begin = new CountdownLatch (1); CountdownLatch end = nouveau compte à rebours (2); Thread thread = new thread (nouveau lecteur (begin, end)); thread.start (); Thread thread2 = new thread (new Player2 (begin, end)); thread2.start (); essayez {System.out.println ("la race commence"); Begin.CountDown (); end.Await (); System.out.println ("The Race End"); } catch (exception e) {e.printStackTrace (); }}Exécutez-le, voici les résultats
Le programme principal a été bloqué et n'a pas été éveillé. L'arbitre utilise les toilettes depuis un certain temps!
Il semble que Countdown () ne réveille pas directement le fil, c'est un peu comme un comptoir, le compte à rebours.
Vérifiez la documentation de l'API, bien sûr, nous avons ajouté le paramètre 2 au constructeur, et nous devons appeler Countdown () 2 fois pour réveiller le thread bloqué de fin.Await ().
CountdownLatch end = nouveau compte à rebours (2);
Pour résumer,
1. CountdownLatch end = nouveau compte à rebours (n); // Lors de la construction d'un objet, vous devez passer dans le paramètre N.
2. End.Await () peut bloquer les threads jusqu'à ce que la méthode fin.CountDown () soit appelée n fois avant la libération du thread.
3. end.CountDown () peut être appelé dans plusieurs threads pour calculer le nombre d'appels qui sont la somme de tous les threads.
Dans le prochain blog, je vais expliquer comment CountdownLatch fonctionne à partir du niveau du code source.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.