phaser 的核心在于解耦阶段推进与参与者生命周期,形成可预测、可验证、可复用的行为契约:阶段自动原子推进,参与者显式注册/注销,多阶段语义通过 arriveandawaitadvance()、awaitadvance(int) 和 onadvance() 三方法协作实现。

Phaser 对多阶段并行任务流的标准化支持,核心不在“多阶段”本身,而在于它把「阶段推进」与「参与者生命周期」解耦绑定,形成一套可预测、可验证、可分层复用的行为契约。
阶段推进是隐式且原子的
Phaser 不要求你声明“一共几个阶段”,也不提供 setPhase() 或 gotoNextPhase() 这类手动干预接口。阶段编号(从 0 开始)只在所有已注册且未注销的参与者都完成当前阶段后,才自动+1。这个推进动作不可中断、不可回退、不可跳过——只要调用 arriveAndAwaitAdvance() 并成功返回,就代表:当前阶段已全员就绪,下一阶段已开启,且该线程已自动进入新阶段的等待队列。
- 返回值是下一阶段编号,可用于日志追踪或断言(如 assert phase == 1),但不能用于控制分支逻辑
- 若某线程未调用 arriveAndAwaitAdvance(),它不会阻塞阶段推进——除非它仍被注册且未到达;但若它已 arriveAndDeregister(),就不再计入计数
- 阶段推进失败(如某线程异常退出未注销)会导致其他线程永久阻塞在 awaitAdvance(),需配合超时或终止机制兜底
参与者管理是显式且线程安全的
注册(register())和注销(arriveAndDeregister())必须由参与者自身在线程上下文中执行,不是构造参数,也不是外部指令。这种设计强制了责任归属:谁加入,谁退出,谁对阶段同步有效性负责。
- new Phaser(3) 只是初始化内部计数器为 3,并不等价于 3 个合法注册者;漏 register 就 arrive,直接抛 IllegalStateException
- arriveAndDeregister() 是唯一安全的退出方式;分开写 arrive(); deregister(); 会失败,因为 deregister() 非 public
- 主线程若只做协调(如加载完发校验指令),就不注册,改用 awaitAdvance(int) 等待子线程推进,避免干扰计数
多阶段语义通过组合而非配置表达
Phaser 本身没有“阶段类型”或“阶段元数据”,但它的行为天然支撑标准任务流模式:
- 流水线式:每个线程按固定顺序执行 stage1 → stage2 → stage3,靠多次 arriveAndAwaitAdvance() 实现
- 分组式:用父子 Phaser 结构,子组内推进自己的 phase,每完成一阶段自动为父 Phaser arrive(),父 phase 推进即表示“所有子组本阶段齐备”
- 条件式:重写 onAdvance(int phase, int parties),在特定 phase 返回 true 终止 Phaser(如 phase==3 且数据校验失败),或执行聚合逻辑(如 phase==2 时汇总各 worker 结果)
标准化落地依赖三类契约方法
真正让多阶段流可维护、可测试、可监控的,是以下三个方法形成的协作协议:
- arriveAndAwaitAdvance():工作者线程的“我好了,请推进”信号,是阶段同步的事实入口
- awaitAdvance(int expectedPhase):协调线程的“我盯住这一阶段,直到它结束”守候,不参与计数,只消费进度
- onAdvance():扩展点,用于注入阶段边界逻辑(如统计、清理、决策是否继续),是流程控制的钩子
这三者共同构成了一种轻量但严谨的阶段流契约:不靠注解或配置驱动,而靠方法调用顺序与返回值语义达成一致理解。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











