2014-02-16 74 views
14

Java中的CyclicBarrier/CountDownLatchjoin有什麼區別? CyclicBarrierCountDownLatch的優點是什麼?在我看來,只需使用join我們可以等待一個線程完成其執行。CyclicBarrier/CountDownLatch和Java中的連接有什麼區別?

+0

是的,你可以解決許多情況下簡單地加入,但使用CountDownLatch或的CyclicBarrier,使得它更容易。 – Pshemo

回答

24

是,「t.join()」,使當前線程等待「T」線結束,當一個線程在等待其他一些我們可以編寫線程鏈。但有時CountDownLatch/CyclicBarrier更方便。

首先,CountDownLatch /的CyclicBarrier不要求所有工作線程應該結束了。線程可以在應用程序運行的所有時間運行。他們只是讓我們說「一些工作」已經做了很多次了。此外,如果我們有N個作業和M個線程並且N> M,則某些線程可以多次執行任務,直到它們的通用Barier N爲0爲止。此示例顯示CountDownLatch/CyclicBarrier是在M個線程之間共享N個任務的非常有用的基元。

此外,使用join()方法,每個線程都應該有另一個線程的引用調用join()方法。它使你的代碼有點骯髒,特別是當你有超過2個工作線程時。共享一個CountDownLatch/CyclicBarrier實例看起來更清晰。

的CyclicBarrier和CountDownLatch之間的主要區別是,的CyclicBarrier是可重複使用的和CountDownLatch不是。您可以通過調用reset()方法來重新使用CyclicBarrier,該方法將屏障重置爲其初始狀態。

CountDownLatch是良好的像應用程序/模塊的啓動時間和一個的CyclicBarrier時間事件可以在複發性事件的情況下例如可以用於每次輸入數據改變時同時(重新)計算。

你可以找到一些很好的例子:

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()等待一個線程完成。 CountDownLatch.await()允許N個線程等待,直到倒計數達到0.它可以用來確保N個線程同時開始執行某些操作(例如開始比賽),或者在N個線程到達給定的時間後喚醒另一個線程點(比賽結束,例如)。

The javadoc給出了使用CountDownLatch的一個具體的例子。閱讀。

CyclicBarrier與CountDownLatch類似,但允許定期協調點。

相關問題