CountdownLatch -Anweisungen finden Sie in Ihrer Referenz. Der spezifische Inhalt ist wie folgt
Countdownlatch ist ein Java.util.Concurrent -Paket Nächster Synchronisierungs -Tool -Klasse, mit dem ein oder mehrere Threads warten können, bis ein Satz von Vorgängen in anderen Threads abgeschlossen ist.
Die Verwendung von Countdownlatch ist sehr einfach. Das folgende Beispiel ist auch das, was ich online gesehen habe, und es ist sehr angemessen. Ich werde es hier posten.
public class test {public static void main (String [] args) {Countdownlatch begin = new Countdownlatch (1); Countdownlatch End = new Countdownlatch (2); für (int i = 0; i <2; i ++) {Thread = neuer Thread (neuer Player (begin, Ende)); Thread.Start (); } try {System.out.println ("The Race Begin"); begin.countdown (); end.aait (); System.out.println ("The Race End"); } catch (Ausnahme e) {e.printstacktrace (); }}}/*** Player*/Class Player implementiert runnable {private Countdownlatch begin; privates Countdownlatch -Ende; Player (Countdownlatch -Beginn, Countdownlatch -Ende) {this.begin = begin; this.end = Ende; } public void run () {try {begin.await (); System.out.println (Thread.currentThread (). GetName () + "angekommen!") ;; End.Countdown (); } catch (interruptedException e) {e.printstacktrace (); }}}Nachfolgend finden Sie die laufenden Ergebnisse
Sie können sehen, dass wir durch die Verwendung von Countdownlatch die Ausführungsreihenfolge von Threads steuern.
Im obigen Code verwenden wir die Await () -Methode und die Countdown () -Methode. Überprüfen wir ihre jeweiligen Funktionen.
Verifizieren Sie zuerst die Awiit () -Methode. Kommentieren Sie das Ende. Await () in der Hauptmethode. Das Folgende ist das Run -Ergebnis nach dem Ausbotten.
Sie können sehen, dass der Haupt -Thread nicht darauf wartet, dass der Thread den Kandidaten beendet, und gab direkt bekannt, dass der Wettbewerb vorbei war! Das Spiel, das am Anfang endete ---
Hier ist zu sehen, dass die Awiit () -Methode einen Blockiereffekt hat
Zweitens überprüfen wir die Countdown -Methode und kommentieren Sie am Ende.Countdown () im Thread des Teilnehmers. Das Folgende ist das laufende Ergebnis.
Das Programm ist ausgeführt und alle Spieler haben die Ziellinie erreicht, aber der Schiedsrichter fördert einfach nicht das Ende des Spiels. Worauf wartet er?
Wir vermuten, dass die Countdown () -Methode den Effekt hat, den blockierenden Faden aufzuwachen.
Dann können wir uns fragen, da es die Funktion hat, den Blockierfaden aufzuwachen, ist es nicht möglich, den blockierten Haupt -Thread aufzuwecken, wenn wir nur einmal die Countdown () -Methode aufrufen?
Versuchen wir es, die oben genannte coutdown () Annotation, einen Spieler erneut erstellen, der Code ist wie folgt
Class Player2 implementiert Runnable {private Countdownlatch begin; privates Countdownlatch -Ende; Player2 (Countdownlatch -Beginn, Countdownlatch -Ende) {this.begin = begin; this.end = Ende; } public void run () {try {begin.await (); System.out.println (Thread.currentThread (). GetName () + "angekommen!"); // end.countdown (); } catch (interruptedException e) {e.printstacktrace (); }}}Die Hauptmethode wird ebenfalls wie folgt geändert, wodurch zwei verschiedene Spieler erstellt werden
public static void main (String [] args) {Countdownlatch begin = new Countdownlatch (1); Countdownlatch End = new Countdownlatch (2); Thread Thread = neuer Thread (neuer Spieler (Beginn, Ende)); Thread.Start (); Thread2 = neuer Thread (neuer Player2 (Beginn, Ende)); thread2.Start (); try {System.out.println ("The Race Begin"); begin.countdown (); end.aait (); System.out.println ("The Race End"); } catch (Ausnahme e) {e.printstacktrace (); }}Führen Sie es aus, hier sind die Ergebnisse
Das Hauptprogramm wurde blockiert und nicht geweckt. Der Schiedsrichter benutzt die Toilette schon eine Weile!
Es scheint, dass Countdown () den Thread nicht direkt aufweckt, sondern ein bisschen wie ein Zähler, Countdown.
Überprüfen Sie die API -Dokumentation, sicher genug, wir haben dem Konstruktor Parameter 2 hinzugefügt, und wir müssen Countdown () 2 -mal aufrufen, um den blockierten Thread von End.Await () aufzuwecken.
Countdownlatch End = new Countdownlatch (2);
Um zusammenzufassen,
1. Countdownlatch end = new Countdownlatch (n); // Beim Aufbau eines Objekts müssen Sie in Parameter N übergeben.
2. End.aWait () kann Threads bis zum Ende blockieren.
3.. End.Countdown () kann in mehreren Threads aufgerufen werden, um die Anzahl der Aufrufe zu berechnen, die die Summe aller Threads sind.
Im nächsten Blog werde ich erklären, wie Countdownlatch auf der Ebene der Quellcode funktioniert.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.