REJAVA / LEARNING NOTES
第8课速查:CompletableFuture(可编排的异步结果)
随时回查术语、规则和示例;完整解释见对应课程。
根据课程材料整理
本次更新说明
- 整理为公开学习笔记,保留要点、对照表与练习入口。
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 原文 · 课程目录