Future 只能 get() 阻塞等结果,无法表达「完成后接着做」「两个结果合并」这类依赖关系。CompletableFuture 把异步任务变成可组合的管道:创建用 supplyAsync(有返回值)/runAsync;串联用 thenApply(同步转换)、thenCompose(扁平化嵌套 Future,相当于 flatMap)、thenAccept(消费);并行汇聚用 thenCombine(两两合并)、allOf/anyOf(批量等待/竞速);异常处理用 exceptionally(兜底值)、handle(成败统一处理)、whenComplete(只观察不修改)。
实践要点:1)显式传线程池——默认用 ForkJoinPool.commonPool,阻塞型任务会拖累全局,IO 任务务必自定义池;2)方法名带 Async 后缀的版本会切线程池执行,不带的在「完成它的线程」里同步执行,链上嵌套时要清楚执行线程;3)allOf 返回的是 CompletableFuture,要逐个 join 收结果;4)join() 与 get() 的差别在受检异常的包装方式;5)超时控制 Java 9 加了 orTimeout/completeOnTimeout,之前要额外调度。追问方向:CompletableFuture 为什么不适合做无限流(与响应式 Reactor/WebFlux 的定位差异)、异常在异步链中的传播路径(不处理会被吞到哪)。
(约 430 字)