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