在Java并发开发中,CompletableFuture提供了比传统Future更灵活的异步任务处理能力。它不仅可以后台执行任务,还支持链式编排和异常兜底,让异步代码像写同步逻辑一样直观。

创建异步任务
最常用的是supplyAsync和runAsync。前者有返回值,后者无返回值。可以传入自定义线程池,也可以使用默认ForkJoinPool。
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(2);
// 有返回值的异步任务
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
return "hello";
}, pool);
// 无返回值的异步任务
CompletableFuture<Void> f2 = CompletableFuture.runAsync(() -> {
System.out.println("run");
}, pool);
System.out.println(f1.get());
pool.shutdown();
}
}
链式转换与消费
使用thenApply可以做结果转换,thenAccept只消费不返回,thenRun在完成后执行动作。这些方法也都有异步版本以Async结尾。
CompletableFuture<Integer> lenFuture = CompletableFuture
.supplyAsync(() -> "abc")
.thenApply(s -> s.length())
.thenApply(len -> len * 2);
System.out.println(lenFuture.get());
组合多个异步任务
当多个任务相互独立时,可用thenCombine汇聚结果;若只需等所有完成可用allOf。下面演示并行调用并汇总。
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "A"); CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "B"); CompletableFuture<String> combined = a.thenCombine(b, (x, y) -> x + y); System.out.println(combined.get());
异常处理技巧
异步链中某一步抛异常会中断后续。使用exceptionally可提供默认值,handle则无论成败都能处理并返回新结果。
CompletableFuture<Integer> safe = CompletableFuture
.supplyAsync(() -> {
if (true) throw new RuntimeException("err");
return 1;
})
.exceptionally(ex -> 0);
System.out.println(safe.get());
超时控制
Java 9之后提供了orTimeout和completeOnTimeout,可避免任务无限挂起。
CompletableFuture<String> withTimeout = CompletableFuture
.supplyAsync(() -> {
try { Thread.sleep(2000); } catch (InterruptedException e) {}
return "done";
})
.completeOnTimeout("timeout", 1, java.util.concurrent.TimeUnit.SECONDS);
System.out.println(withTimeout.get());
小结
掌握CompletableFuture的创建、链式编排、组合与异常恢复,可以显著简化Java异步开发。实际项目中建议显式传入线程池,并合理设置超时,防止资源耗尽。
CompletableFuture异步任务Java并发修改时间:2026-07-25 18:54:22