我无意中发现了CyclicBarrier和Phaser实用程序在中的区别。
我理解CyclicBarrier允许一组线程等待直到所有线程到达一个特定的点。相位器也这样做,但它支持多个阶段。我也明白,CyclicBarrier可以重用。--我认为这个重用工具使它的功能与Phaser相同。
考虑下列方案:
测试相位:
import java.util.concurrent.Phaser;
public class PhaserTest {
public static void main(String[] args) {
Phaser p = new Phaser(3);
Thread t1 = new Thread(() -> process(p), "T1");
Thread t2 = new Thread(() -> process(p), "T2");
Thread t3 = new Thread(() -> process(p), "T3");
t1.start();
t2.start();
t3.start();
}
private static void process(Phaser p) {
try {
System.out.println("Started Phase 1: "+Thread.currentThread().getName());
p.arriveAndAwaitAdvance();
System.out.println("Finished Phase 1: "+Thread.currentThread().getName());
System.out.println("Started Phase 2: "+Thread.currentThread().getName());
p.arriveAndAwaitAdvance();
System.out.println("Finished Phase 2: "+Thread.currentThread().getName());
} catch(Exception e) {}
}
}输出:
Started Phase 1: T1
Started Phase 1: T2
Started Phase 1: T3
Finished Phase 1: T3
Started Phase 2: T3
Finished Phase 1: T1
Finished Phase 1: T2
Started Phase 2: T2
Started Phase 2: T1
Finished Phase 2: T2
Finished Phase 2: T3
Finished Phase 2: T1测试CyclicBarrier:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(3);
Thread t1 = new Thread(() -> process(cb), "T1");
Thread t2 = new Thread(() -> process(cb), "T2");
Thread t3 = new Thread(() -> process(cb), "T3");
t1.start();
t2.start();
t3.start();
}
private static void process(CyclicBarrier cb) {
try {
System.out.println("Started Phase 1: "+Thread.currentThread().getName());
cb.await();
System.out.println("Finished Phase 1: "+Thread.currentThread().getName());
System.out.println("Started Phase 2: "+Thread.currentThread().getName());
cb.await();
System.out.println("Finished Phase 2: "+Thread.currentThread().getName());
} catch(Exception e) {}
}
}输出:
Started Phase 1: T1
Started Phase 1: T2
Started Phase 1: T3
Finished Phase 1: T3
Started Phase 2: T3
Finished Phase 1: T1
Started Phase 2: T1
Finished Phase 1: T2
Started Phase 2: T2
Finished Phase 2: T2
Finished Phase 2: T3
Finished Phase 2: T1在PhaserTest和CyclicBarrierTest中,直到所有各方都到达/完成前一阶段,下一阶段才开始。
所以,拥有Phaser有什么好处?
发布于 2018-03-27 08:52:33
相位器来自JSR-166
在将阶段器与现有Java特性进行比较时,我们解释了支持与CyclicBarrier类类似的功能(在Java 5中引入),但是phasers本质上更灵活: java.util.concurrent CyclicBarrier类支持一组线程之间的周期性屏障同步。然而,与相位器不同的是,CyclicBarriers不支持线程的动态添加或删除,也不支持单向同步或分阶段操作。探索其他障碍实现的主要动机之一不仅是增强灵活性,还在于提高屏障同步概念的性能和可伸缩性: 在三个不同的SMP平台上实现阶段器的可移植实现所获得的性能结果表明,除了它们的通用性和安全性属性带来的生产力好处之外,它们还可以提供比现有障碍实现更好的性能。
这里的全部解释:https://www.infoq.com/news/2008/07/phasers
还有一篇将Phaser定义为CyclicBarier+CountdownLatch的比较文章:http://flex4java.blogspot.com/2015/03/why-and-how-to-use-phaser-in-java.html
https://stackoverflow.com/questions/49506820
复制相似问题