2012-09-04 43 views
3

我讀的書Java Concurrency in Practice的地方說,壁壘打破例如

CyclicBarrier允許各方的固定數量屏障點反覆會合,並在分解的問題轉換成並行迭代算法有用固定數量的獨立子問題。

有人可以舉例說明它如何將問題分解成多個獨立的子問題?

+4

看看'bulk synchronous parallel'範例,你需要一個循環障礙。 –

回答

6

你必須自己將問題分解成多個獨立的子問題。

障礙確保每一方在第二個子問題開始之前完成第一個子問題。這確保在第二個子問題開始之前,第一個子問題的所有數據都可用。

當每個步驟實際上完全相同時,需要重複使用同一個屏障時特別使用CyclicBarrier。例如,在進行任何類型的多線程現實模擬時,可能會發生這種情況。 CyclicBarrier將確保每個線程在所有線程開始下一步之前完成給定步驟。

1

IF你有一個算法,可以在獨立的子問題被分解,
THEN一個的CyclicBarrier是有用的所有線程在他們的計算結束滿足,例如,合併它們的結果。

請注意,Java 7中引入的Fork/Join框架使您可以在不需要使用CyclicBarrier的情況下做類似的事情。

5

由於目前尚未CountDownLatchCyclicBarrier和之間的另一個重要區別是:在CountDownLatch同步線程不能表明什麼地方出了毛病的其他線程,從而使其他線程可以有一個選擇,要麼繼續你的中止整個合作行動。

CycliBarrier的情況下,而其中一個線索是在await()等待另一個線程被中斷或超時,那麼BrokenBarrierException將發生在當前線程表示事情已經在合作的一個線程出了錯。

BrokenBarrierException也會出現在其他情況下,你可以在Javadoc找到await()方法。開箱即用,CountDownLatch不提供此功能。