Phaser的使用

2019-01-19  本文已影响0人  永远的太阳0123
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 介绍

上一篇 下一篇

猜你喜欢

热点阅读