phaser如何使用java
Phaser 的基本概念
Phaser 是 Java 并发包(java.util.concurrent)中的一个同步工具,用于多线程分阶段任务的协同。它允许线程在多个阶段(phase)中动态注册和注销,并在每个阶段结束时同步等待其他线程完成。
创建 Phaser
Phaser 的构造函数可以指定初始参与线程数(parties),也可以不指定,后续动态调整。

Phaser phaser = new Phaser(); // 默认 parties=0
Phaser phaser = new Phaser(3); // 初始注册 3 个线程
注册与注销线程
线程可以通过 register() 方法注册到 Phaser,或通过 arriveAndDeregister() 注销。

phaser.register(); // 增加一个参与者
phaser.arriveAndDeregister(); // 到达当前阶段并注销
同步等待阶段完成
arrive():标记当前线程到达阶段,但不等待其他线程。arriveAndAwaitAdvance():到达当前阶段并等待其他线程,全部到达后进入下一阶段。arriveAndDeregister():到达后注销,减少后续阶段的参与者。
phaser.arriveAndAwaitAdvance(); // 等待所有线程到达
阶段编号与终止
Phaser 的阶段编号从 0 开始递增,可通过 getPhase() 获取当前阶段。调用 forceTermination() 可强制终止 Phaser。
示例代码
以下示例展示 3 个线程分阶段执行任务:
import java.util.concurrent.Phaser;
public class PhaserDemo {
public static void main(String[] args) {
Phaser phaser = new Phaser(3); // 初始 3 个线程
for (int i = 0; i < 3; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 完成阶段 0");
phaser.arriveAndAwaitAdvance(); // 等待其他线程
System.out.println(Thread.currentThread().getName() + " 完成阶段 1");
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " 退出");
phaser.arriveAndDeregister();
}).start();
}
}
}
高级功能
- 分层 Phaser:通过
Phaser(parentPhaser)创建树形结构的 Phaser,减少竞争。 - 回调:重写
onAdvance(int phase, int parties)方法,在阶段推进时执行自定义逻辑。
Phaser phaser = new Phaser() {
@Override
protected boolean onAdvance(int phase, int parties) {
System.out.println("阶段 " + phase + " 完成");
return super.onAdvance(phase, parties);
}
};
注意事项
- 确保线程数匹配注册数,避免过早终止或死锁。
- 动态调整参与者时需谨慎,避免并发问题。
通过合理使用 Phaser,可以实现复杂的多阶段线程同步,适用于分批次处理任务的场景。






