CompletableFuture串行执行需用thenCompose(异步中再异步)、thenApply(同步转换)等链式方法;thenCompose自动展平嵌套,thenApply适用于简单加工;需指定线程池避免阻塞,并用exceptionally或handle处理异常。

CompletableFuture 串行执行多个异步任务,核心是用 thenApply、thenCompose 或 thenAccept 等“then”系列方法链式调用,让前一个任务的完成结果作为后一个任务的输入,形成依赖关系。
用 thenCompose 实现真正串行(推荐)
如果每个任务本身返回一个新的 CompletableFuture(即“异步中再异步”),必须用 thenCompose,它会自动展平一层嵌套,避免 CompletableFuture
- 适合场景:任务 B 需要等任务 A 完成后,再发起一个新异步操作(比如查完用户再查其订单)
- 写法示例:userFuture.thenCompose(user -> fetchOrdersAsync(user.id))
- 错误示范:用 thenApply 返回 CompletableFuture,会导致类型不匹配,后续无法直接 .join() 或 .get()
用 thenApply 处理同步转换逻辑
如果后一步只是对上一步结果做简单加工(不发起新异步调用),用 thenApply 更轻量、更直观。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合场景:解析 JSON 字符串 → 转成对象 → 计算某个字段值
- 所有操作都在当前线程(或前一个任务的线程)完成,无额外异步调度
- 返回类型是泛型 T,不是 CompletableFuture
,不会改变执行流结构
控制执行线程(避免阻塞主线程)
默认情况下,thenApply/thenCompose 在前一个任务完成的线程上执行;如需指定线程池,用带 Executor 参数的重载方法。
立即学习“Java免费学习笔记(深入)”;
- 例如:task1.thenCompose(r -> task2).thenApply(r -> r.toUpperCase()).thenAccept(System.out::println).join()
- 加线程池:thenApplyAsync(..., executor) 或 thenComposeAsync(..., executor)
- 注意:不要在 thenApply 中调用 .get() 或 .join(),否则可能造成线程阻塞甚至死锁
异常处理不能漏
串行链中任一环节抛异常,后续 thenXXX 不会执行。务必用 exceptionally 或 handle 捕获。
- exceptionally:只处理异常,返回替代值,类型需与前一步一致
- handle:统一处理成功和失败,两个参数(result, throwable),更灵活
- 示例:fetchUser().thenCompose(this::fetchProfile).handle((profile, ex) -> ex != null ? "default" : profile)

















