CompletableFuture是Java 8引入的可手动完成、支持回调与链式编排的增强型Future,具备非阻塞回调、任务编排、主动生命周期控制、明确线程策略及自然异常传播等核心特性。

CompletableFuture 是 Java 8 引入的异步编程核心工具,本质是一个可手动完成、支持回调和链式编排的 Future。它弥补了传统 Future 的短板:不用阻塞等待、能组合依赖任务、自带异常处理、支持函数式风格。
CompletableFuture 的关键特性
它不是简单的“异步容器”,而是面向任务流程设计的增强型 Future:
- 非阻塞回调:结果就绪后自动触发 thenApply、thenAccept 等方法,主线程无需轮询或死等
- 任务可编排:支持串行(thenCompose)、并行(thenCombine)、聚合(allOf/anyOf)、条件分支(handle)
- 主动控制生命周期:可通过 complete()、completeExceptionally() 手动设定结果或异常,适合桥接外部事件
- 线程策略明确:不带 Executor 的方法默认走 ForkJoinPool.commonPool();带 Executor 的可精准控制执行线程池
- 异常传播自然:异常会沿链传递,可用 exceptionally() 或 handle() 统一捕获,避免 get() 时突然抛出 ExecutionException
创建异步任务的两种基本方式
根据是否需要返回值选择对应方法:
-
runAsync():执行无返回值的 Runnable 任务,返回 CompletableFuture
例:CompletableFuture.runAsync(() -> System.out.println("日志已写入")); -
supplyAsync():执行有返回值的 Supplier 任务,返回 CompletableFuture
例:CompletableFuturefuture = CompletableFuture.supplyAsync(() -> fetchUserName(userId));
两个方法都有带 Executor 的重载版本,用于替换默认线程池,避免耗尽 commonPool() 影响其他并行流操作。
立即学习“Java免费学习笔记(深入)”;
常用结果处理与转换方法
所有以 then 开头的方法都属于“结果就绪后触发”,但行为不同:
- thenApply():接收上一阶段结果,返回新值(类型可变),形成新的 CompletableFuture
- thenAccept():消费结果,不返回值,适合记录、通知等副作用操作
- thenRun():既不接收结果也不返回值,纯后续动作(如清理资源)
- whenComplete():无论成功或异常都会执行,接收 (result, throwable) 二元参数,适合统一日志或监控
- handle():类似 whenComplete,但支持返回新值,可用于异常兜底并转为正常结果
组合多个异步任务的典型场景
真实业务很少只跑一个异步任务,CompletableFuture 提供了清晰的组合语义:
-
串行依赖(A 完成后才执行 B):用
thenCompose(),B 是返回 CompletableFuture 的函数,避免嵌套 -
并行独立(A 和 B 同时跑,都完成后合并):用
thenCombine(),传入另一个 CompletableFuture 和合并函数 -
等待全部完成:用
CompletableFuture.allOf(cf1, cf2, cf3),返回 void 类型 CompletableFuture;再用 join() + get() 分别取结果 -
只要任一完成就响应:用
CompletableFuture.anyOf(cf1, cf2, cf3),返回 Object 类型 CompletableFuture,需自行转型
基本上就这些。掌握 runAsync/supplyAsync 创建、thenXXX 处理、组合与异常这三类用法,就能覆盖绝大多数异步需求。










