推荐用join()获取结果(纯异步链),不抛受检异常;get()需处理InterruptedException和ExecutionException,建议带超时;最佳实践是用thenAccept、thenApply等回调式方法避免阻塞。

CompletableFuture 获取最终执行结果,主要靠 get() 或 join() 方法,但两者行为和适用场景不同,选错容易阻塞线程或掩盖异常。
用 join() 获取结果(推荐用于纯异步链)
join() 是 CompletableFuture 自带的阻塞等待方法,不抛出受检异常,适合在已知任务完成、或配合 thenApply/thenAccept 等后续操作时使用。它会一直等到计算完成,返回结果;若任务异常结束,则包装为 CompletionException 抛出。
- 无参 join():直接等待并返回结果,例如 future.join()
- 适合用在 Lambda 链中,比如 supplyAsync(...).thenApply(...).join()
- 不会因 InterruptedException 中断当前线程(不响应中断)
用 get() 获取结果(需处理异常和超时)
get() 继承自 Future 接口,会抛出 InterruptedException 和 ExecutionException,更严格但也更可控。实际开发中常搭配超时使用,避免无限等待。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- future.get():可能永远阻塞,不建议单独使用
- future.get(3, TimeUnit.SECONDS):带超时,超时抛出 TimeoutException
- 捕获 ExecutionException 时,要通过 getCause() 拿到原始异常
不阻塞地消费结果(最佳实践)
真正发挥 CompletableFuture 优势的方式,是避免主动“获取”结果,而是用回调式方法定义后续逻辑:
- thenAccept(result -> {...}):消费结果,无返回值
- thenApply(result -> transform(result)):转换结果,返回新 CompletableFuture
- exceptionally(err -> defaultResult) 或 handle((r, t) -> {...}):统一处理成功与异常
注意:不要在主线程里盲目调用 get()/join()
尤其在 Web 应用(如 Spring MVC)或事件循环线程中,直接调用会阻塞整个线程,降低吞吐量。应优先设计成非阻塞链式调用,或明确交由线程池处理阻塞操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










