Wie ist CountDownLatch verwendet, die in Java Multithreading?
Kann mir jemand helfen zu verstehen, was Java CountDownLatch
ist und Wann es zu benutzen?
Ich don T haben eine sehr klare Vorstellung davon, wie dieses Programm funktioniert. So wie ich das verstehe alle drei threads starten gleichzeitig und jeder Thread aufrufen, CountDownLatch nach 3000ms. So der count down wird Dekrementieren. Nach der Verriegelung ist gleich null, das Programm druckt "Abgeschlossen". Vielleicht ist der Weg, habe ich verstanden, ist falsch.
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Processor implements Runnable {
private CountDownLatch latch;
public Processor(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
System.out.println("Started.");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
}
//-----------------------------------------------------
public class App {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(3); //coundown from 3 to 0
ExecutorService executor = Executors.newFixedThreadPool(3); //3 Threads in pool
for(int i=0; i < 3; i++) {
executor.submit(new Processor(latch)); //ref to latch. each time call new Processes latch will count down by 1
}
try {
latch.await(); //wait until latch counted down to 0
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Completed.");
}
}
InformationsquelleAutor der Frage amal | 2013-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie haben richtig verstanden.
CountDownLatch
arbeiten im latch-Prinzip, der Haupt-thread wartet bis das Tor offen ist. Ein thread wartet auf n threads angegeben, die beim erstellen derCountDownLatch
.Jedem thread, in der Regel der Haupt-thread der Anwendung, die Anrufe, die
CountDownLatch.await()
warten, bis die Zählung null erreicht oder es durch einen anderen thread unterbrochen. Alle anderen threads sind erforderlich, um ein count-down durch den AufrufCountDownLatch.countDown()
sobald Sie abgeschlossen sind oder bereit.Sobald die Zählung null erreicht, wird der wartende thread weiter. Einer der Nachteile/Vorteile
CountDownLatch
ist, dass es nicht wieder: einmal die Zählung null erreicht, können Sie nicht verwendenCountDownLatch
mehr.Edit:
Verwenden
CountDownLatch
wenn ein thread (wie der Haupt-thread) benötigt, um zu warten ein oder mehrere threads, um abzuschließen, bevor es mit der Verarbeitung Fort.Einem klassischen Beispiel für die Verwendung
CountDownLatch
in Java ist eine server-side-core-Java-Anwendung, die Dienste-Architektur, bei der mehrere Leistungen erbracht werden, die von mehreren threads und kann die Anwendung nicht starten Sie die Bearbeitung, bis alle Dienste erfolgreich gestartet wurden.P. S.
OP ' s Frage, hat eine ziemlich einfache Beispiel, so dass ich nicht zählen.
InformationsquelleAutor der Antwort NikolaB
CountDownLatch
in Java ist eine Art von synchronizer, die es einem ermöglichtThread
zu warten, für eine oder mehrereThread
s, bevor es beginnt mit der Verarbeitung.CountDownLatch
funktioniert auf latch-Prinzip-thread warten, bis Tor offen ist. Ein thread wartet aufn
Anzahl der angegebenen threads beim erstellenCountDownLatch
.z.B.
final CountDownLatch latch = new CountDownLatch(3);
Hier setzen wir den counter auf 3.
Jedem thread, in der Regel Haupt-thread der Anwendung, die Anrufe, die
CountDownLatch.await()
warten, bis die Zählung null erreicht oder es ist unterbrochen durch eine andereThread
. Alle anderen threads sind erforderlich, um ein count-down durch den AufrufCountDownLatch.countDown()
sobald Sie abgeschlossen sind oder bereit, den job. sobald die Zählung null erreicht, wird derThread
erwartet läuft.Hier die Zählung erhalten dekrementiert durch
CountDownLatch.countDown()
Methode.Den
Thread
fordert dieawait()
Methode wird gewartet, bis der erste Zähler bei null.Machen, zählen null andere threads aufrufen müssen, die
countDown()
Methode.Sobald der Graf sich null den thread aufgerufen, der
await()
Methode resume (start seiner Ausführung).Den Nachteil
CountDownLatch
ist, dass es nicht wieder: einmal der Graf sich null ist es nicht mehr nutzbar.InformationsquelleAutor der Antwort Vishal Akkalkote
NikolaB erklärt es sehr gut, Aber Beispiel wäre hilfreich zu wissen, Also hier ist ein einfaches Beispiel...
InformationsquelleAutor der Antwort vikashait
Es wird verwendet, wenn wir wollen, zu warten, für mehr als ein thread seine Aufgabe abgeschlossen. Es ist ähnlich wie Mitmach-threads.
Wo wir können CountDownLatch
Betrachten wir ein Szenario, wo haben wir die Forderung, wo wir drei threads "A", "B" und "C" und starten wollen wir thread "C" nur, wenn "A" und "B" - threads, die abgeschlossen oder teilweise abgeschlossen ist Ihre Aufgabe.
Es kann angewendet werden, um die Reale Welt Szenario
Betrachten wir ein Szenario, in dem manager geteilt Module zwischen Entwicklungs-teams (A und B), und er will Sie zuordnen, um QA-team für Tests nur dann, wenn sowohl die teams vervollständigt Ihre Aufgabe.
Ausgabe des obigen code wird:
Aufgabe, die Entwicklung team devB
Aufgabe, die Entwicklung team devA
Aufgabe fertig Entwicklungsteam devB
Aufgabe fertig Entwicklungsteam devA
Aufgabe zugewiesen QA-team
Aufgabe fertig QA-team
Hier await() Methode wartet countdownlatch-flag auf 0, und countDown () - Methode verringert countdownlatch-flag von 1.
Beschränkung der JOIN:
Obige Beispiel kann auch erreicht werden, mit JOIN, aber die VERKNÜPFUNG kann nicht verwendet werden, in zwei Szenarien:
InformationsquelleAutor der Antwort V Jo
Ein gutes Beispiel, Wann so etwas mit Java-Simple-Serial-Connector, Zugriff auf serielle ports. In der Regel werden Sie etwas schreiben, auf den Hafen, und asyncronously, in einem anderen thread, das Gerät reagiert auf eine SerialPortEventListener. In der Regel werden Sie wollen, um eine pause nach dem schreiben auf den port, die Antwort zu warten. Die Handhabung der thread-locks für dieses Szenario manuell zu erfassen, ist extrem schwierig, aber mithilfe von Countdownlatch ist einfach. Bevor Sie gehen denken Sie können machen es auf eine andere Weise, vorsichtig sein, über race conditions, die Sie nie gedacht!!
Pseudocode:
InformationsquelleAutor der Antwort user2709454
CoundDownLatch es ermöglicht, einen thread warten, bis alle threads fertig sind, mit Ihrer Ausführung.
Pseudo-code:
InformationsquelleAutor der Antwort
Wenn Sie fügen Sie einige debug-nach Ihrem Anruf zu verschließen.countDown(), diese kann Ihnen helfen, zu verstehen, sein Verhalten besser.
Die Ausgabe zeigt die Zählung wird verringert. Dieser "Zähler" ist effektiv die Anzahl von Ausführbaren Aufgaben (Prozessor-Objekte) haben Sie begonnen, gegen die countDown() hat nicht angerufen wurde und daher gesperrt ist der Haupt-thread auf seine Forderung zu verschließen.warten auf().
InformationsquelleAutor der Antwort natmat
Aus der oracle-Dokumentation über CountDownLatch:
Einen
CountDownLatch
initialisiert wird mit einer bestimmten Anzahl. Dieawait
Methoden blockiert, bis der aktuelle Zählwert null erreicht, durch Anrufung dercountDown()
Methode, danach werden alle wartenden threads freigegeben werden und alle nachfolgenden Aufrufe von erwarten sofort wieder zurück. Dies ist ein one-shot-Phänomen-der count nicht zurückgesetzt werden.Einen
CountDownLatch
initialisiert mit der Anzahl der dient als eine einfache on - /off-Verriegelung, Gatter: alle threads aufrufen warten, warten am gate, bis es geöffnet ist von einem thread aufrufen countDown().Einen
CountDownLatch
initialisiert N kann verwendet werden, um zu machen eines thread warten, bis N threads abgeschlossen haben, eine Aktion oder eine Aktion abgeschlossen wurde N-mal.Wenn der aktuelle Zähler null ist, wird diese Methode sofort zurückgegeben.
Wenn der aktuelle Zählwert größer als null ist, dann ist es erniedrigt. Wenn die neue Zählung null ist, dann werden alle wartenden threads werden wieder aktiviert, für thread-scheduling-Zwecken.
Erklärung von Ihrem Beispiel.
Den Sie gesetzt haben, zählen als 3 für
latch
variableHinter diesem gemeinsamen
latch
zu Worker thread :Processor
Runnable
InstanzenProcessor
eingereicht wordenExecutorService
executor
Haupt-thread (
App
) wartet zählen zu null mit unter AnweisungProcessor
thread schläft für 3 Sekunden und dann ist es, dekrementiert er count-Wert mitlatch.countDown()
Ersten
Process
Instanz ändern latch-Zählung als 2 nach Abschluss aufgrundlatch.countDown()
.Zweiten
Process
Instanz ändern latch-Zählung als 1 nach Abschluss aufgrundlatch.countDown()
.Dritten
Process
Instanz ändern latch-Zählung als 0, nachdem Sie nach Abschluss aufgrundlatch.countDown()
.Null rechnen Verriegelung bewirkt, dass Haupt-thread
App
kommen ausawait
App Programm druckt diese Ausgabe jetzt :
Completed
InformationsquelleAutor der Antwort Ravindra babu
Wie bereits in JavaDoc (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html), CountDownLatch ist eine Synchronisierung Hilfe, eingeführt in Java 5. Hier die Synchronisierung bedeutet nicht, dass die Beschränkung des Zugangs zu einem kritischen Abschnitt. Aber eher Sequenzierung Aktionen verschiedener threads.
Die Art der Synchronisation erreicht durch CountDownLatch ist ähnlich der von Join.
Angenommen, es gibt einen thread, "M", die muss warten, bis andere worker-threads "T1", "T2", "T3", um seine Aufgaben
Vor Java 1.5, die Art und Weise dies getan werden kann, ist, M ausführen des folgenden Codes
Der obige code stellt sicher, dass Gewinde M Lebensläufe seiner Arbeit nach T1, T2, T3 seine Arbeit abgeschlossen ist. T1, T2, T3 abschließen können Ihre Arbeit in beliebiger Reihenfolge.
Das gleiche kann erreicht werden durch CountDownLatch, wobei T1,T2, T3 und Gewinde M haben die gleiche CountDownLatch-Objekts.
"M" - Anfragen :
countDownLatch.await();
wo als "T1","T2","T3" hat
countDownLatch.countdown();
Einen Nachteil mit der join-Methode ist, dass M zu wissen, T1, T2, T3. Wenn es einen neuen worker-thread-T4 später Hinzugefügt, dann M muss sich bewusst sein, es auch. Dies kann vermieden werden, mit CountDownLatch.
Nach der Umsetzung der Reihenfolge der Maßnahmen wäre [T1,T2,T3](in der Reihenfolge T1,T2,T3, könnte trotzdem sein) -> [M]
InformationsquelleAutor der Antwort S R Chaitanya
Besten Echtzeit-Beispiel für countDownLatch erklärt in diesem link CountDownLatchExample
InformationsquelleAutor der Antwort Ashwin Patil