phaser是支持动态伸缩的阶段式弹性同步协调器,通过phase编号自动推进、运行时注册/注销参与者、定制onadvance逻辑及主线程协同,实现多线程自适应协作。

Phaser不是“等齐就放行”的简单屏障,而是以阶段(phase)为节奏、支持动态伸缩的弹性同步协调器。它把阶段推进和参与者管理彻底解耦,让多线程协作能自然适应任务分片变化、失败熔断或资源回收等真实场景。
阶段驱动的自动同步流程
Phaser内部维护一个从0开始单调递增的phase编号。每次所有当前已注册的线程都调用arriveAndAwaitAdvance()后,phase自动+1,全部线程被唤醒进入新阶段。
- 线程只需在每个阶段末尾统一调用该方法,无需关心具体phase数值
- 调用arrive()仅上报到达状态,不阻塞,适合日志埋点或异步通知
- 主线程可通过getPhase()实时读取当前阶段号,用于监控或回滚判断
运行时动态调整参与者数量
这是Phaser区别于CyclicBarrier和CountDownLatch的核心能力——注册与注销完全在任务执行中发生,线程安全且无残留。
- 新线程启动前调用register(),立即成为当前及后续阶段的参与者
- 任务完成或异常退出时调用arriveAndDeregister(),既标记到达又解除绑定
- 预知新增数量时可用bulkRegister(n)批量注册,提升初始化效率
- 未显式注销的线程不会导致泄漏——Phaser绑定到单次任务实例,任务结束即可被GC回收
每阶段可定制的协调逻辑
重写onAdvance(int phase, int registeredParties)方法,就能在阶段切换前插入业务控制逻辑。
- 参数phase是刚完成的阶段号(如phase=2表示第2阶段结束)
- 参数registeredParties是下一阶段预计参与的线程数
- 返回true可终止整个Phaser,后续arrive调用将立即返回负值
- 常见用途包括:记录各阶段耗时、校验中间结果、触发清理动作、或根据条件提前退出流程
主线程可作为协调中枢参与
Phaser不限定角色,主线程同样可以注册并主导流程,形成主从式任务编排结构。
- 调度器触发任务时创建新Phaser(如new Phaser(1),主线程先占位)
- 子线程启动后调用register()加入,注册成功才开始执行,确保计数准确
- 主线程可在关键节点调用awaitAdvance(phaser.getPhase())等待全体完成某阶段
- 任一子任务抛出未捕获异常,主线程可调用forceTermination()强制终止,其余线程快速响应退出











