phaser是阶段同步器而非调度器,通过显式调用arriveandawaitadvance()等方法推进阶段,支持动态参与者管理、onadvance钩子控制生命周期,并可通过父子phaser实现分层协同。

Phaser 不是调度器,而是阶段同步器。它不管任务谁来干、怎么分,只管“谁在哪个阶段到了没”。用对了,就能让预加载、校验、提交这类天然分阶段的任务,按需伸缩、精准卡点、安全收尾。
阶段推进必须靠显式到达动作
Phaser 的 phase 不会自己动,必须靠线程调用 arriveAndAwaitAdvance() 或 arriveAndDeregister() 才能触发递增。关键细节:
- arriveAndAwaitAdvance() 是“齐步走”的核心:完成本阶段 + 等所有人到齐 + 进入下一阶段,返回值就是新 phase 编号
- arrive() 只报到不等待,适合纯通知场景;若后续要等,得搭配 awaitAdvance(int)
- awaitAdvance(int phase) 不自动抵达,调用前必须先 arrive() 或 arriveAndDeregister(),否则永远阻塞
- 未注册就调用 arrive 系列方法,直接抛 IllegalStateException: Not registered
参与者管理要动态且原子
线程不是配置项,是运行时角色。注册和退出都得主动、及时、成对:
- 初始化推荐 new Phaser() 或 new Phaser(null, 0),从零开始更可控
- 每个工作线程启动后第一件事:调 register();批量创建可用 bulkRegister(n)
- 阶段性退出必须用 arriveAndDeregister() —— 它是原子操作,“到达+注销”一步到位
- 避免 arriveAndAwaitAdvance() 后再 deregister:前者已推进 phase,后者可能落在新 phase,导致计数错乱
- 主线程若只协调不干活,不注册,改用 awaitAdvance(int) 精准监听;若参与汇总,也得注册
用 onAdvance 控制阶段生命周期
onAdvance(int phase, int registeredParties) 是阶段切换前的统一钩子,适合做决策、清理或终止:
- 返回 true 表示终止 Phaser,后续 arrive 调用立即失败,适合“第三阶段完成后整体收工”
- 返回 false(默认)表示正常进入下一阶段
- 可在其中检查校验结果、释放资源、打日志,但不能做 I/O、锁等待或耗时计算,否则阻塞全阶段
- 结合 getPhase() 做阶段特异性处理,例如 phase == 2 时判断是否达标,不达标则 return true
复杂任务推荐父子 Phaser 分层协同
当任务天然分组(如多个 worker 组各自同步,再由主控统一协调),单 Phaser 容易成为瓶颈。树状结构更健壮:
- 创建父 Phaser:Phaser root = new Phaser()
- 每组新建子 Phaser:Phaser group = new Phaser(root),构造时传入 parent
- 子组内所有成员完成当前 phase 后,子 Phaser 自动为父 Phaser 调一次 arrive()
- 父 Phaser 的 phase 推进,即代表“所有子组已整体就绪”,无需感知内部细节
- 这种结构天然适配 Map-Reduce、分片压测、插件化流水线等场景











