Phaser是JDK1.7引入的一个同步工具类,适用于一些需要分阶段的任务处理。一种人物可以分为多个阶段,现希望保证只有前面一个阶段的任务完成后才能开始后面的任务。这种场景可以使用多个CyclicBarrier来实现,但是需要明确知道总共有多少个阶段,且无法动态修改。Phaser可以同时解决这两个问题。
同步器 | 作用 |
---|---|
CountDownLatch | 倒数计时器 |
CyclicBarrier | 循环栅栏,初始时设定参与线程数,当线程到达栅栏后,会等待其他线程的到达。当到达栅栏的总数满足指定数后,所有等待的线程继续执行。 |
Phaser | 多阶段栅栏,初始时设定参与线程数,也可以中途注册/注销参与者,当到达的参与者数量满足栅栏设定的数量后,会进行阶段升级。 |
import java.io.IOException;
import java.util.concurrent.Phaser;
public class PhaserDemo {
public static void main(String[] args) throws IOException {
int parties = 3;
int phases = 4;
final Phaser phaser = new Phaser(parties) {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
System.out.println("====== Phase : " + phase + " ======");
return registeredParties == 0;
}
};
for(int i = 0; i < parties; i++) {
int threadId = i;
Thread thread = new Thread(() -> {
for(int phase = 0; phase < phases; phase++) {
System.out.println(String.format("Thread %s, phase %s", threadId, phase));
phaser.arriveAndAwaitAdvance();
}
});
thread.start();
}
}
}
执行结果:
Thread 0, phase 0
Thread 1, phase 0
Thread 2, phase 0
====== Phase : 0 ======
Thread 2, phase 1
Thread 0, phase 1
Thread 1, phase 1
====== Phase : 1 ======
Thread 1, phase 2
Thread 2, phase 2
Thread 0, phase 2
====== Phase : 2 ======
Thread 0, phase 3
Thread 1, phase 3
Thread 2, phase 3
====== Phase : 3 ======