Phaser 阶段管理由参与者行为驱动,注册必须前置,到达与等待分离,阶段推进由全体到达触发,支持嵌套分组和 onAdvance 钩子控制流转。

Phaser 的阶段管理不是靠手动维护 phase 变量,而是靠参与者行为驱动——谁注册、谁到达、谁退出,直接决定阶段是否推进。用对 register()、arrive() 和 arriveAndDeregister() 这三个动作,就能自然实现动态线程数下的多阶段同步。
注册必须前置,否则同步失效
Phaser 初始化后注册数为 0,不会自动把调用线程算作参与者。任何线程在执行同步逻辑前,第一件事必须是调用 phaser.register()。
- 主线程协调任务分发:启动子线程前先
phaser.register(),否则后续awaitAdvance()会永远等待一个不存在的“自己” - 子线程工作入口:第一行就
phaser.register(),不能放在业务逻辑之后,否则可能在到达前就被其他线程判定为“未到场” - 避免
new Phaser(5)锁死初始人数——若后续要增减,应使用new Phaser()或new Phaser(null, 0)
阶段推进由“全体到达”触发,不是靠 await
阶段(phase)是隐式递增的整数,每次当前所有已注册且未注销的参与者都完成本阶段到达后,phase 自动 +1。关键在于:到达动作(arrive)和等待动作(await)是分离的。
-
arrive()表示“我这阶段干完了”,但继续留在池中参与下一阶段 -
arriveAndDeregister()表示“我这阶段干完就走”,不参与后续阶段计数 -
awaitAdvance(int phase)是纯等待,不带到达语义——调用前必须先arrive()或arriveAndDeregister(),否则永远等不到 - 推荐写法:记录起始 phase → 启动任务 → 主线程
arrive(); awaitAdvance(p0),确保所有子线程至少抵达第 p0 阶段
按需分组:嵌套 Phaser 管理层次化任务
当任务天然分组(如多个 worker 组各自汇总,再由 coordinator 统一合并),可用父子 Phaser 构建树状协同结构。
- 创建根 phaser:
Phaser root = new Phaser() - 每组新建子 phaser:
Phaser group = new Phaser(root),构造时传入 parent - 子 phaser 每完成一个 own phase,会自动为 root 执行一次
arrive() - 这样,root 的 phase 推进就代表“所有子组均已抵达当前阶段”,适合 Map-Reduce 类流程
onAdvance 控制流转,但严禁阻塞
onAdvance(int phase, int registeredParties) 在每个阶段完成、准备推进前被同步调用,是阶段切换的钩子点。
- 可做轻量判断:比如
if (phase == 2 && !isValid()) return true;表示终止整个 phaser - 可触发阶段专属动作:写日志、清理临时资源、发监控事件
- 禁止 IO、sleep、数据库操作或远程调用——它运行在 Phaser 内部锁内,阻塞会导致所有线程卡住
- 返回
true表示终止,false表示继续下一阶段

















