Phaser phaser = new Phaser();
// 1. 注冊一個(gè) party
phaser.register();
for (int i = 0; i < 10; i++) {
phaser.register();
executorService.submit(() -> {
// 2. 每個(gè)線程到這里進(jìn)行阻塞勋桶,等待所有線程到達(dá)柵欄
phaser.arriveAndAwaitAdvance();
// doWork()
});
}
phaser.arriveAndAwaitAdvance();
Phaser 比較靈活圾另,它不需要在構(gòu)造的時(shí)候指定固定數(shù)目的 parties,而 CountDownLatch 和 CyclicBarrier 需要在構(gòu)造函數(shù)中明確指定一個(gè)數(shù)字尼酿。
我們可以看到拾积,上面的代碼總共執(zhí)行了 11 次 phaser.register() 殉挽,可以把 11 理解為 CountDownLatch 中的 count 和 CyclicBarrier 中的 parties。
這樣讀者應(yīng)該很容易理解 phaser.arriveAndAwaitAdvance() 了拓巧,這是一個(gè)阻塞方法斯碌,直到該方法被調(diào)用 11 次,所有的線程才能同時(shí)通過肛度。
這里和 CyclicBarrier 是一個(gè)意思傻唾,湊齊了所有的線程,一起通過柵欄承耿。
Phaser 也有周期的概念冠骄,一個(gè)周期定義為一個(gè) phase伪煤,從 0 開始。
Phaser 介紹