Phaser支持动态注册线程和多阶段同步,通过arriveAndAwaitAdvance实现线程协作,结合register、deregister与onAdvance回调,适用于复杂并发场景。

Phaser 是 Java 并发包 red">java.util.concurrent 中提供的一个灵活的同步工具,用于协调多个线程在多个阶段的执行。与 CountDownLatch 和 CyclicBarrier 相比,Phaser 支持动态注册参与者,并且可以分阶段重复使用,适用于更复杂的多阶段并发场景。
Phaser 的主要作用是让一组线程在执行到某个阶段时进行同步,所有线程都到达后才能继续下一步。它支持:
最简单的使用方式是创建 Phaser 并指定初始参与线程数,线程调用 arriveAndAwaitAdvance() 等待其他线程到达。
public class PhaserExample {
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() + " 到达第一阶段");
phaser.arriveAndAwaitAdvance(); // 等待其他线程
System.out.println(Thread.currentThread().getName() + " 开始第二阶段");
// 模拟工作
try { Thread.sleep(500); } catch (InterruptedException e) {}
phaser.arriveAndAwaitAdvance(); // 第二阶段同步
}).start();
}
}
}
Phaser 允许在运行时动态增加参与者,适合线程数量不确定的场景。
立即学习“Java免费学习笔记(深入)”;
Phaser phaser = new Phaser();
// 主线程先注册自己
phaser.register();
new Thread(() -> {
phaser.register(); // 动态注册新线程
System.out.println("子线程工作");
phaser.arriveAndAwaitAdvance();
}).start();
System.out.println("主线程等待所有线程完成");
phaser.arriveAndDeregister(); // 主线程到达并注销
注意:每次 register() 增加一个参与者,arriveAndDeregister() 会在到达后减少计数。
可以通过重写 onAdvance(int phase, int registeredParties) 方法,在每个阶段结束时执行特定逻辑,比如判断是否继续下一阶段。
Phaser phaser = new Phaser() {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
System.out.println("第 " + (phase + 1) + " 阶段完成,当前注册线程数:" + registeredParties);
return phase >= 3 || registeredParties == 0; // 执行4个阶段后终止
}
};
phaser.register();
for (int i = 0; i < 2; i++) {
new Thread(() -> {
phaser.register();
for (int j = 0; !phaser.isTerminated(); j++) {
System.out.println(Thread.currentThread().getName() + " 执行第 " + (j+1) + " 阶段");
phaser.arriveAndAwaitAdvance();
}
}).start();
}
phaser.arriveAndDeregister();
基本上就这些。Phaser 在需要多阶段协同、线程动态加入或复杂同步逻辑时非常有用,掌握它的 arrive、await、register、deregister 组合使用方式,能有效提升并发编程的灵活性。
以上就是Java并发编程中Phaser使用方法的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号