0

Ich habe das folgende Programm, wo ich java.util.concurrent.CountDownLatch verwende und ohne Verwendung der await() -Methode funktioniert es gut. Ich bin neu in der Nebenläufigkeit und möchte den Zweck von erwarten() wissen. In "CyclicBarrier" kann ich verstehen, warum wait() benötigt wird, aber warum in "CountDownLatch"?Was ist der Zweck von wait() in CountDownLatch?

Programm,

Klasse CountDownLatchSimple

public static void main(String args[]) { 
    CountDownLatch latch = new CountDownLatch(3); 
    Thread one = new Thread(new Runner(latch),"one"); 
    Thread two = new Thread(new Runner(latch), "two"); 
    Thread three = new Thread(new Runner(latch), "three"); 

    // Starting all the threads 
    one.start(); two.start(); three.start(); 

} 

Klasse Runner implementiert Runnable

CountDownLatch latch; 

public Runner(CountDownLatch latch) { 
    this.latch = latch; 
} 

@Override 
public void run() { 
    System.out.println(Thread.currentThread().getName()+" is Waiting."); 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    latch.countDown(); 
    System.out.println(Thread.currentThread().getName()+" is Completed."); 
} 

OUTPUT zwei wartet. drei wartet. man wartet. Eins ist abgeschlossen. Zwei ist abgeschlossen. drei ist abgeschlossen.

Antwort

0

CountDownLatch ist das Synchronisierungsgrundelement, mit dem auf alle Threads gewartet wird, die eine Aktion ausführen.

Jeder der Thread soll die Arbeit durch Aufruf der countDown() Methode markieren. Derjenige, der darauf wartet, dass die Aktion abgeschlossen wird, sollte die Methode await() aufrufen. Dies wird unbegrenzt warten, bis alle Threads die Arbeit als verarbeitet markieren, indem Sie die countDown() aufrufen. Der Haupt-Thread kann dann fortfahren, indem er beispielsweise die Ergebnisse des Arbeiters verarbeitet.

Also in Ihrem Beispiel wäre es sinnvoll, await() am Ende main() Methode aufzurufen:

latch.await(); 

Hinweis: es gibt viele andere Anwendungsfälle natürlich brauchen sie nicht Fäden zu sein, aber was auch immer die normalerweise asynchron abläuft, kann derselbe Latch mehrmals durch die gleiche Aufgabe usw. dekrementiert werden. Das obige beschreibt nur einen üblichen Anwendungsfall für CountDownLatch.

+0

Danke Zbynek für die schnelle Antwort. Bedeutet das, dass mehrere Countdowns aus demselben Thread als eins betrachtet werden? – NewToJava

+0

@hungry: Nein. Jeder Countdown zählt, egal ob aus demselben Thread. Es weiß eigentlich gar nichts über Thread. –