completablefuture 是 java 8 提供的异步编程核心工具,核心在于声明任务依赖关系而非启动线程;支持串行组合(thenapply/thenaccept/thencompose)、并行汇聚(allof/anyof)、异常处理(exceptionally/handle/whencomplete)及线程池定制。

CompletableFuture 是 Java 8 引入的异步编程核心工具,它让多个异步任务的编排、组合与错误处理变得清晰可控。关键不在于“启动线程”,而在于“声明依赖关系”——用函数式链式调用描述任务如何串行、并行或选择性执行。
串行组合:用 thenApply / thenAccept / thenCompose 传递结果
适合前一个任务的输出是后一个任务输入的场景。注意区分:
- thenApply:转换结果(有返回值),返回新的 CompletableFuture
- thenAccept:消费结果(无返回值),常用于日志、通知等副作用操作
-
thenCompose:用于“返回 CompletableFuture”的函数,避免嵌套 CompletableFuture
>
例如:查用户 → 查订单 → 计算总金额
CompletableFutureCompletableFuture
.thenCompose(user -> CompletableFuture.supplyAsync(() -> orderService.totalAmount(user.getId())))
.thenApply(amount -> amount.multiply(BigDecimal.valueOf(1.1))); // 加税
并行执行:用 allOf / anyOf 汇聚多个独立任务
allOf 等待所有任务完成(但不直接返回结果,需手动 get);anyOf 返回最先完成的那个结果。
- 用 allOf 时,建议配合 stream + join() 提取结果,避免阻塞 get()
- 用 anyOf 后需 instanceof 或 cast 判断类型,因返回 Object
例如:同时拉取用户头像、简介、积分,全部完成后组装 Profile
CompletableFuture
CompletableFuture
CompletableFuture
CompletableFuture
avatar.join(), bio.join(), points.join() // join 不抛检异常,更安全
));
异常处理:用 exceptionally / handle / whenComplete 统一兜底
不要只在最外层 try-catch —— CompletableFuture 的异常默认静默丢失。
- exceptionally:仅在异常时提供替代值(类似 try-catch 的 catch 块)
- handle:无论成功失败都执行,可统一记录日志 + 返回默认值
- whenComplete:只做清理或通知,不改变结果或异常
例如:支付请求失败时返回友好提示,同时记录错误日志
CompletableFuture.handle((result, ex) -> {
if (ex != null) {
log.error("Payment failed for {}", orderId, ex);
return "支付失败,请稍后重试";
}
return result;
});
线程控制:用自定义 Executor 避免阻塞 ForkJoinPool.commonPool()
supplyAsync() / runAsync() 默认用 commonPool(),但 IO 密集型任务(如 HTTP 请求、DB 查询)应配专用线程池,防止拖慢 CPU 密集型任务。
- 创建固定大小线程池(如 Executors.newFixedThreadPool(10)),避免无界队列风险
- IO 类任务推荐使用 cachedThreadPool 或带拒绝策略的定制池
- 务必在应用关闭时显式 shutdown,避免线程泄漏
例如:
ExecutorService ioPool = Executors.newFixedThreadPool(8);CompletableFuture
// … 使用后记得 ioPool.shutdown()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











