Das Schloss entspricht einer Tür, bevor das Schloss den Endzustand erreicht, die Tür ist immer geschlossen und es kann kein Faden passieren. Wenn der Endzustand erreicht ist, öffnet sich die Tür und lässt alle Fäden passieren. Es kann dazu führen, dass ein oder mehrere Threads auf das Eintreten einer Reihe von Ereignissen warten. Der Verriegelungszustand besteht aus einem Zähler, der mit einer formalen, positiven Zahl initialisiert wird, die die Anzahl der zu wartenden Ereignisse angibt. Die countDown-Methode dekrementiert den Zähler und zeigt damit an, dass ein Ereignis eingetreten ist, während die Wait-Methode darauf wartet, dass der Zähler 0 erreicht, was anzeigt, dass das erwartete Ereignis eingetreten ist. CountDownLatch betont, dass ein Thread (oder mehrere Threads) warten müssen, bis andere n Threads etwas abgeschlossen haben, bevor er mit der Ausführung fortfahren kann.
Szenarioanwendung:
10 Athleten bereiten sich auf den Lauf vor. Sie warten auf die Anweisung des Schiedsrichters und beginnen gleichzeitig mit dem Laufen. Wenn die letzte Person die Ziellinie passiert, endet das Spiel. 10 Bewegungen entsprechen 10 Threads. Der Schlüssel besteht darin, die gleichzeitige Ausführung von 10 Threads zu steuern und festzustellen, wann der letzte Thread den Endpunkt erreicht hat. Es können zwei Schlösser verwendet werden. Das erste Schloss dient zur Steuerung von 10 Threads, die auf den Befehl des Schiedsrichters warten, und das zweite Schloss steuert das Ende des Spiels.
import java.util.concurrent.CountDownLatch; Klasse Aworker implementiert Runnable { private int num; private CountDownLatch end; public Aworker(int num, final CountDownLatch end) { this.num = num; = begin; this.end = end } @Override public void run() { // TODO Automatisch generierter Methoden-Stub try { System.out.println(num + "th people is ready"); begin.await(); //Ready} Catch (InterruptedException e) { e.printStackTrace( } Finally { end.countDown(); Zähler verringert sich um eins und erreicht den Endpunkt System.out.println(num + "th people take"); public class Race { public static void main(String[] args) { int num = 10; CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, begin, end)).start() ; } try { Thread.sleep((long) (Math.random() * 5000)); Automatisch generierter Catch-Block e1.printStackTrace(); } System.out.println("judge say: run!"); //Starten Sie den Lauf, nachdem der Schiedsrichter den Befehl gegeben hat long startTime = System.nanoTime( ); try { end.await(); //Wait for end} Catch (InterruptedException e) { // TODO Automatisch generierter Catch-Block e.printStackTrace( } Finally { long endTime = System.nanoTime(); System.out.println("richter sagen: alle angekommen!"); System.out.println("spend time: " + (endTime - startTime));
Ausgabe
1. Person ist bereit, 2. Person ist bereit, 4. Person ist bereit, 6. Person ist bereit, 3. Person ist bereit, 10. Person ist bereit, 8. Person ist bereit, 5. Person ist bereit, 7. Person ist bereit, 9. Person ist bereit, Richter sagen: Laufen! !9. Person kommt an7. Person kommt an8. Person kommt an3. Person kommt an6. Person kommt anpend Zeit: 970933