CompletableFuture 是 Java 8 引入的异步编程核心类,支持主动回调、链式编排与异常可控;需通过 supplyAsync、runAsync 等静态方法创建,禁用直接 new;提供 thenApply/Async、thenCompose、thenCombine 等组合操作;异常处理含 exceptionally、handle、whenComplete;协同控制支持 allOf/anyOf;慎用 get(),推荐非阻塞组合。

CompletableFuture 是 Java 8 引入的核心异步编程工具,它把 Future 的被动轮询升级为主动回调 + 组合编排能力,真正让异步代码可读、可链、可错控。
CompletableFuture 的创建方式
不能直接 new,必须通过静态工厂方法启动:
-
supplyAsync(Supplier):有返回值的异步任务(推荐),例如
CompletableFuture.supplyAsync(() -> doHeavyWork()) - runAsync(Runnable):无返回值的异步任务,适合发通知、写日志等
- completedFuture(T):立即完成的 CompletableFuture,常用于测试或兜底返回
- 也可用
new CompletableFuture()手动触发(慎用),配合complete()或completeExceptionally()控制状态
异步任务的串行与并行组合
CompletableFuture 支持函数式链式调用,关键在于区分“是否切换线程”和“是否等待结果”:
- thenApply / thenAccept / thenRun:上一阶段完成后,在**同一个线程池**(默认 ForkJoinPool)中执行后续逻辑;适用于轻量处理
- thenApplyAsync / thenAcceptAsync:显式开启新异步阶段,可传自定义 Executor,适合耗时操作避免阻塞前序线程
-
thenCompose:用于“返回另一个 CompletableFuture”的场景,实现扁平化嵌套(类似 Mono.flatMap),避免 CompletableFuture
> - thenCombine / thenAcceptBoth:合并两个独立异步任务的结果,例如查用户 + 查订单,再一起组装响应
异常处理与 fallback 机制
CompletableFuture 把异常当作一等公民来处理,不抛出就无法中断链路:
立即学习“Java免费学习笔记(深入)”;
- exceptionally(Function):仅当发生异常时触发,接收 Throwable,返回默认值(类型需匹配)
- handle(BiFunction):无论成功或失败都执行,参数为 (result, throwable),更灵活地统一收口
- whenComplete(BiConsumer):只做副作用(如清理资源、打日志),不改变结果或异常状态
- 注意:
get()会阻塞并包装异常为 ExecutionException;生产环境应尽量避免调用,改用非阻塞组合方式
多个任务的协同控制
实际业务常需协调多个异步操作:
- CompletableFuture.allOf(...):等待所有任务完成(返回 void CompletableFuture),适合“全成功才继续”,但不聚合结果——需手动 get 每个原始 future
- CompletableFuture.anyOf(...):任一完成即结束,返回第一个完成的 CompletableFuture(类型为 Object,需强转,慎用)
- 更实用的是 allOf + stream + join 模式:先 collect 成数组,allOf 后用 stream.map(f -> f.join()) 提取结果列表
- 超时控制可用
orTimeout(long, TimeUnit)(Java 9+)或封装带 scheduled future 的逻辑
CompletableFuture 不是万能胶,过度链式嵌套仍会导致可读性下降;合理划分任务边界、搭配虚拟线程(Java 21+)或反应式框架(如 Project Reactor),才能在高并发场景下稳住异步这艘船。











