我讀的書Java Concurrency in Practice的地方說,壁壘打破例如
CyclicBarrier
允許各方的固定數量屏障點反覆會合,並在分解的問題轉換成並行迭代算法有用固定數量的獨立子問題。
有人可以舉例說明它如何將問題分解成多個獨立的子問題?
我讀的書Java Concurrency in Practice的地方說,壁壘打破例如
CyclicBarrier
允許各方的固定數量屏障點反覆會合,並在分解的問題轉換成並行迭代算法有用固定數量的獨立子問題。
有人可以舉例說明它如何將問題分解成多個獨立的子問題?
你必須自己將問題分解成多個獨立的子問題。
障礙確保每一方在第二個子問題開始之前完成第一個子問題。這確保在第二個子問題開始之前,第一個子問題的所有數據都可用。
當每個步驟實際上完全相同時,需要重複使用同一個屏障時特別使用CyclicBarrier。例如,在進行任何類型的多線程現實模擬時,可能會發生這種情況。 CyclicBarrier將確保每個線程在所有線程開始下一步之前完成給定步驟。
IF你有一個算法,可以在獨立的子問題被分解,
THEN一個的CyclicBarrier是有用的所有線程在他們的計算結束滿足,例如,合併它們的結果。
請注意,Java 7中引入的Fork/Join框架使您可以在不需要使用CyclicBarrier的情況下做類似的事情。
由於目前尚未CountDownLatch
和CyclicBarrier
和之間的另一個重要區別是:在CountDownLatch
同步線程不能表明什麼地方出了毛病的其他線程,從而使其他線程可以有一個選擇,要麼繼續你的中止整個合作行動。
在CycliBarrier
的情況下,而其中一個線索是在await()
等待另一個線程被中斷或超時,那麼BrokenBarrierException
將發生在當前線程表示事情已經在合作的一個線程出了錯。
BrokenBarrierException
也會出現在其他情況下,你可以在Javadoc找到await()
方法。開箱即用,CountDownLatch
不提供此功能。
看看'bulk synchronous parallel'範例,你需要一個循環障礙。 –