Phaser phaser = new Phaser();
// 1. 注册一个 party
phaser.register();
for (int i = 0; i < 10; i++) {
phaser.register();
executorService.submit(() -> {
// 2. 每个线程到这里进行阻塞,等待所有线程到达栅栏
phaser.arriveAndAwaitAdvance();
// doWork()
});
}
phaser.arriveAndAwaitAdvance();
Phaser 比较灵活,它不需要在构造的时候指定固定数目的 parties,而 CountDownLatch 和 CyclicBarrier 需要在构造函数中明确指定一个数字。
我们可以看到,上面的代码总共执行了 11 次 phaser.register() ,可以把 11 理解为 CountDownLatch 中的 count 和 CyclicBarrier 中的 parties。
这样读者应该很容易理解 phaser.arriveAndAwaitAdvance() 了,这是一个阻塞方法,直到该方法被调用 11 次,所有的线程才能同时通过。
这里和 CyclicBarrier 是一个意思,凑齐了所有的线程,一起通过栅栏。
Phaser 也有周期的概念,一个周期定义为一个 phase,从 0 开始。
Phaser 介绍
网友评论