我正在阅读Java Concurrency in Practice一书,它说,
CyclicBarrier
允许固定数量的参与方在障碍点重复会合,并且在将问题分解为固定数量的独立子问题的并行迭代算法中很有用。
有人可以举例说明它如何将问题分解为多个独立的子问题吗?
我正在阅读Java Concurrency in Practice一书,它说,
CyclicBarrier
允许固定数量的参与方在障碍点重复会合,并且在将问题分解为固定数量的独立子问题的并行迭代算法中很有用。
有人可以举例说明它如何将问题分解为多个独立的子问题吗?
您必须自己将问题分解为多个独立的子问题。
障碍确保每一方在他们中的任何一方开始第二个子问题之前完成第一个子问题。这确保了在第二个子问题开始之前,来自第一个子问题的所有数据都可用。
CyclicBarrier 专门用于在每个步骤实际上相同的情况下一次又一次地需要相同的屏障。例如,在进行任何类型的多线程现实模拟时可能会发生这种情况,这种模拟是分步完成的。CyclicBarrier 将确保在所有线程开始下一步之前每个线程都已完成给定步骤。
CountDownLatch
和和之间还有另一个重要区别CyclicBarrier
是:同步的线程CountDownLatch
不能指示其他线程出现问题,因此其他线程可以选择继续中止整个协作操作。
如果某个CycliBarrier
线程正在等待await()
某个其他线程被中断或超时,那么BrokenBarrierException
当前线程上将发生 a,表明其中一个协作线程出现问题。
BrokenBarrierException
也将发生在您可以在 Javadoc onawait()
方法中找到的其他情况下。
开箱即用,CountDownLatch
不提供此功能。
如果您有一个可以分解为独立子问题的算法,
那么CyclicBarrier 对您的所有线程在计算结束时会面很有用,例如,合并它们的结果。
请注意,Java 7 中引入的Fork/Join框架使您能够执行类似的操作,而无需使用 CyclicBarrier。