Es kann als Countdown -Verriegelung (Countdown) übersetzt werden. Unnötig zu erwähnen, dass der Riegel, wie der Name schon sagt, Fortschritte verhindern. Hier bedeutet dies, dass die Methode countdownlatch.await () den aktuellen Thread blockiert, bevor der Countdown 0 ist.
Countdownlatch ist eine synchrone Helferklasse, mit der ein oder mehrere Threads warten können, bis eine Reihe von Operationen in anderen Threads ausgeführt werden.
Countdownlatch funktioniert ähnlich wie bei der Thread.join () -Methode und kann für die Zusammenarbeit zwischen einer Gruppe von Threads und einer anderen Gruppe von Threads verwendet werden. Zum Beispiel benötigt der Hauptfaden eine Reihe von Vorbereitungen, bevor er einen Job erledigt. Nur wenn alle diese Vorbereitungen abgeschlossen sind, kann der Hauptfaden seine Arbeit fortsetzen. Diese Vorbereitungen sind unabhängig voneinander, sodass sie gleichzeitig ausgeführt werden können, um die Geschwindigkeit zu erhöhen. In diesem Szenario kann Countdownlatch verwendet werden, um die Planung zwischen Threads zu koordinieren. In der Zeit, in der Threads direkt (vor Java 5.0) erstellt wurden, können wir Thread.Join () verwenden. Nachdem JUC angezeigt wird, muss Countdownlatch verwendet werden, da Threads im Thread -Pool nicht direkt referenziert werden können.
Die Countdownlatch -Klasse ist ein synchroner Zähler. Beim Konstruktion wird der int -Parameter übergeben. Dieser Parameter ist der Anfangswert des Zählers. Jedes Mal, wenn die Countdown () -Methode aufgerufen wird, wird der Zähler durch 1 verringert, und der Zähler ist größer als 0, die Warte () -Methode blockiert das Programm und setzt die Ausführung fort. Countdownlatch kann als Countdown -Verriegelung angesehen werden, wodurch ein bestimmtes Ereignis ausgelöst wird, wenn die Anzahl auf 0 reduziert wird. Mit dieser Funktion kann der Haupt -Thread auf das Ende des untergeordneten Threads warten. Das Folgende ist ein Beispiel für einen simulierten Athletenwettbewerb.
Ein sehr typisches Anwendungsszenario von Countdownlatch ist: Es gibt eine Aufgabe, die nach unten ausgeführt werden möchte. Sie müssen jedoch warten, bis andere Aufgaben ausgeführt werden, bevor Sie weiter nach unten ausgeführt werden können. Wenn unsere Aufgabe, die wir weiter ausführen möchten, weiter aufzurufen, die Await () des Countdownlatch -Objekts aufruft, und die anderen Aufgaben auf dem gleichen Countdownlatch -Objekt aufrufen, nachdem sie ihre eigenen Aufgaben ausgeführt haben, wird die Aufgabe, die die Warte (Await ()) -Methode aufruft, weiter blockiert und wartet, bis der Zählwert des CountdownLatch -Objekts 0 abnimmt.
Countdownlatch -Funktionsliste
Countdownlatch (int count) erstellt einen mit einer bestimmten Anzahl initialisierten Countdownlatch. // Lassen Sie den aktuellen Thread warten, bis der Verriegelung auf Null zählt, es sei denn, der Thread ist unterbrochen. Void warte () // lässt den aktuellen Thread warten, bis der Verriegelungsriegel auf Null zählt, es sei denn, der Thread wird unterbrochen oder die angegebene Wartezeit überschritten. Boolesche erwartet (langfristige Zeit, Zeiteinheit) // Deaktivieren Sie die Anzahl der Riegel. Wenn die Anzahl Null erreicht, werden alle wartenden Threads veröffentlicht. void Countdown () // gibt die aktuelle Anzahl zurück. Long getCount () // gibt einen String zurück, der diesen Latch und ihren Status identifiziert. String toString ()
Countdownlatch -Datenstruktur
Das UML -Klassendiagramm von Countdownlatch ist wie folgt:
Die Datenstruktur von Countdownlatch ist einfach, sie wird über "freigegebene Sperren" implementiert. Es enthält Synchronisierungsobjekte, Synchronisierung ist der Synchronisierungsart. Synchronisation ist eine Instanzklasse, die von AQs erbt.
Beispiel für Countdownlatch
Das Folgende wird über Countdownlatch implementiert: "Haupt Thread" wartet, bis "5 untergeordnete Threads" die "angegebenen Arbeiten (1000 ms)" vervollständigen, bevor sie weiter ausgeführt werden.
import java.util.concurrent.countdownlatch; import Java.util.concurrent privates statisches Countdownlatch Donesignal; public static void main (String [] args) {try {Donesignal = new Countdownlatch (latch_size); // 5 neue Aufgaben erstellen für (int i = 0; i <latch_size; i ++) new InnerThread (). Start (); System.out.println ("Haupt warten, begin."); // "Haupt -Thread" wartet auf die Fertigstellung von 5 Aufgaben im Thread -Pool, um Donesignal.aait () auszufüllen; System.out.println ("Main Await fertig."); } catch (interruptedException e) {e.printstacktrace (); }} statische Klasse InnerThread erweitert Thread {public void run () {try {thread.sleep (1000); System.out.println (Thread.currentThread (). GetName () + "Sleep 1000ms"); // den Wert von Countdownlatch mit 1 Donesignal.Countdown () subtrahieren; } catch (interruptedException e) {e.printstacktrace (); }}}} Auslaufergebnisse:
Main Auseait Beginn.Thread-0 Schlaf 1000m.Thread-2 Schlaf 1000m.Thread-1 Schlaf 1000m.Thread-4 Sleep 1000m.Thread-3 Sleep 1000m.
Die Ergebnisbeschreibung: Der Haupt -Thread verwendet Donesignal. Wenn Donesignal 0 ist, wird Main nach dem Erwachen weiterhin ausgeführt.
PS: Unterschied zwischen Countdownlatch und Cyclicbarrier:
(1) Die Funktion des Countdownlatch besteht darin, 1 oder N -Threads zu warten, bis andere Threads die Ausführung abschließen können. Während Cyclicbarrier N -Threads aufeinander warten können.
(2) Der Zähler von Countdownlatch kann nicht zurückgesetzt werden; Der Zähler von Cyclicbarrier kann nach dem Zurücksetzen verwendet werden, so dass er als Schleifenbarriere bezeichnet wird.