2014-02-16 4 views
14

Was ist der Unterschied zwischen CyclicBarrier/CountDownLatch und join in Java? Was ist der Vorteil von CyclicBarrier und CountDownLatch? Meiner Meinung nach, einfach join verwenden wir können warten, bis ein Thread seine Ausführung abgeschlossen hat.Was ist der Unterschied zwischen CyclicBarrier/CountDownLatch und Join in Java?

+0

Ja, können Sie viele Szenarien lösen einfach mit schließen, aber CountDownLatch oder CyclicBarrier Verwendung erleichtert. – Pshemo

Antwort

24

Ja, "t.join()" macht den aktuellen Thread, der auf den Thread "t" wartet, fertig und wir können eine Kette von Threads vorbereiten, wenn ein Thread auf einen anderen wartet. Aber manchmal CountDownLatch/CyclicBarrier sind bequemer.

Zunächst müssen CountDownLatch/CyclicBarrier nicht alle Arbeitsfäden fertig sein. Die Threads können die ganze Zeit ausgeführt werden, in der die Anwendung ausgeführt wird. Sie lassen uns nur sagen, dass "etwas Arbeit" mehrmals gemacht wird. Darüber hinaus können einige Threads, wenn wir N Jobs und M Threads und N> M haben, einen Job mehrmals ausführen, bis ihr gemeinsames Barier N 0 ist. Dieses Beispiel zeigt, dass CountDownLatch/CyclicBarrier sehr nützliche Primitive sind, um N Tasks zwischen M Threads zu teilen.

Um join() zu verwenden, sollte jeder Thread auch einen Verweis auf einen anderen Thread haben, um join() aufzurufen. Es macht Ihren Code ein wenig schmutzig, besonders wenn Sie mehr als 2 Arbeitsfäden haben. Die gemeinsame Nutzung einer Instanz von CountDownLatch/CyclicBarrier wird klarer.

Der Hauptunterschied zwischen CyclicBarrier und CountDownLatch ist, dass CyclicBarrier wiederverwendbar ist und CountDownLatch nicht. Sie können CyclicBarrier wiederverwenden, indem Sie die reset() -Methode aufrufen, die die Barriere in ihren Ausgangszustand zurücksetzt.

CountDownLatch ist gut für einmaliges Ereignis wie Anwendung/Modul Start-up-Zeit und CyclicBarrier kann verwendet werden im Falle eines wiederkehrenden Ereignisses, z. gleichzeitig (neu-) Berechnung jedes Mal, wenn sich die Eingabedaten geändert haben.

Sie können einige gute Beispiele finden Sie unter:

http://javarevisited.blogspot.sg/2012/07/countdownlatch-example-in-java.html http://javarevisited.blogspot.ru/2012/07/cyclicbarrier-example-java-5-concurrency-tutorial.html

10

join() wartet auf den Abschluss eines Threads. CountDownLatch.await() erlaubt N Threads zu warten, bis der Countdown 0 erreicht. Es kann verwendet werden, um sicherzustellen, dass N Threads gleichzeitig etwas starten (zum Beispiel ein Rennen starten) oder einen anderen Thread aufwecken, sobald N Threads ein bestimmtes erreicht haben Punkt (zum Beispiel das Ende eines Rennens).

The javadoc gibt ein konkretes Beispiel für die Verwendung von CountDownLatch. Lies es.

CyclicBarrier ist vergleichbar mit CountDownLatch, ermöglicht aber regelmäßige Koordinationspunkte.

Verwandte Themen