请解释 CompletableFuture 的概念,并结合实际项目说明你是如何使用它来实现并发搜索的。
考察说明
考查对 Java 并发编程中 CompletableFuture 的理解及其在真实场景中落地并发搜索的能力。
回答思路
- 【回答框架 1】CompletableFuture 是 Java 8 引入的异步编程工具,实现了 Future 和 CompletionStage 接口,支持链式回调、组合并行任务和异常处理。核心机制在于通过内部的任务编排,将多个异步操作组合为完整的计算流程,避免传统 Future 的阻塞等待。
- 【回答框架 2】在并发搜索场景下,将搜索拆分为多个独立子任务,如关键词匹配、数据库查询、缓存查询或调用多个搜索源。使用 CompletableFuture.supplyAsync 为每个子任务创建异步执行,通过 thenCombine 或 allOf 将结果汇聚,再通过 handle 统一处理异常和超时。
- 【回答框架 3】具体实现中需定义线程池,避免使用默认的 ForkJoinPool.commonPool,以免与 I/O 密集任务竞争。线程池大小结合任务类型设置,通常 I/O 密集可配置较大线程数。对异步任务设置超时,可选 exceptionally 兜底,保证整体响应时间可控。
- 【回答框架 4】调用端通过 join 或 get 获取最终结果,get 需处理检查和受检异常。为提升性能,可并行发起多个搜索源请求,汇聚时用 thenCombine 或 allOf 后获取各阶段结果,最终组装统一的搜索结果返回。
- 【关键点 1】CompletableFuture 支持异步编排,通过 stage 方法实现串行、并行与异常处理。
- 【关键点 2】并发搜索中应合理划分独立子任务,使用 supplyAsync 和 thenCombine 组合结果。
- 【关键点 3】自定义线程池,避免使用公共池,并设置超时防止任务挂起。
- 【关键点 4】处理异常和降级,常用 exceptionally 或 handle 返回默认结果。
- 【易错点 1】盲目使用默认线程池导致资源竞争,应基于任务特性自定义线程池。
- 【易错点 2】未设置超时可能导致线程阻塞,整体并发搜索响应延迟。
- 【易错点 3】忽略异常处理可能导致任务失败时整个搜索失败,需兜底降级。