← ReJava · 学习目录

REJAVA / LEARNING NOTES

第8课速查:CompletableFuture(可编排的异步结果)

随时回查术语、规则和示例;完整解释见对应课程。

Java 17 / 21更新于 2026.10.12约 3 分钟阅读

根据课程材料整理

本次更新说明
  • 整理为公开学习笔记,保留要点、对照表与练习入口。

1 · 为什么需要

Future(异步结果句柄):get(获取结果方法) 阻塞、不能编排。CompletableFuture(可编排的异步结果) 实现 Future(异步结果句柄)+CompletionStage(完成阶段接口),上一阶段完成自动触发下一阶段。

supplyAsync(有返回值)/runAsync(无),立即返回;allOf(全部完成方法) 等全部,再逐个 join(等待完成方法)。并行总耗时≈最慢那个。

回看

2 · 编排方法

apply 算新结果 · accept 做件事 · run 不用结果。 then 一个 · combine 两个都完成 · either 任一个。

函数返回普通值 → thenApply(map);返回 CompletableFuture(可编排的异步结果) → thenCompose(flatMap)。互不依赖两个 → thenCombine(结果合并方法);三个以上 → allOf(全部完成方法);任一 → anyOf(任一完成方法)。

回看

3 · 在哪执行

不传 Executor(执行器接口) → ForkJoinPool.commonPool():并行度=处理器数−1(至少 1)、全应用共享、守护线程。

生产传自己的 ThreadPoolExecutor(线程池执行器):有界队列、线程命名、明确拒绝策略。

thenApply(结果变换方法) 可能在完成上一步的线程或调用方线程执行;慢步骤用 thenApplyAsync(fn, pool)。

回看

4 · 异常

沿链往后传,后续 thenApply(结果变换方法) 不执行,包成 CompletionException(完成异常)。

join(等待完成方法) → CompletionException(非受检);get(获取结果方法) → ExecutionException(受检);原始异常在 getCause()。

exceptionally(异常兜底方法) 出错给替代值 · handle(结果与异常处理方法) 成败都算新值 · whenComplete(完成回调方法) 成败都执行、不改结果。allOf(全部完成方法) 前每项先兜底。

回看

5 · 超时与取消

get(t) 调用方最多等 t;orTimeout(超时失败方法) 到时异常完成;completeOnTimeout(超时默认值方法) 到时给默认值(Java 9 起)。

都不停止原任务。 cancel(true) 不中断(参数无效果),只让结果变成已取消。要释放线程:给 HTTP/SQL 调用本身设超时。

回看

6 · 怎样讲清楚一个用例

为什么并行(互不依赖、串行相加)→ 哪个线程池(独立、有界,不用公共池)→ 失败与超时(每项降级,整页不崩)→ 限制(不停原任务、下游压力不减、ThreadLocal 不跟随)。

办件详情页是教学例子,用来演示设计思路。

回看

返回完整课程 · 检验 · 官方依据与源码 · JavaGuide 原文 · 课程目录