MST

星途 面试题库

面试题:Java 中 CompletableFuture 多个任务 AND 组合关系的性能优化及场景应用

在高并发场景下,使用 CompletableFuture 实现多个任务的 AND 组合关系可能会遇到性能瓶颈。请分析可能出现性能问题的点,并阐述如何进行针对性的优化。同时,举例说明至少两种适合使用 CompletableFuture 多个任务 AND 组合关系的实际业务场景,并说明这样设计的优势。
36.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

性能问题点分析

  1. 线程资源消耗:每个 CompletableFuture 任务默认使用 ForkJoinPool.commonPool() 线程池,高并发时可能导致线程竞争,资源消耗过大。
  2. 任务阻塞:AND 组合关系意味着所有任务都完成才能继续,若其中有任务执行时间长,会阻塞后续操作,导致整体性能下降。
  3. 结果获取开销:使用 get() 方法获取任务结果时会阻塞调用线程,可能影响整体并发性能。

针对性优化措施

  1. 自定义线程池:创建合适大小的自定义线程池,避免 commonPool() 的资源竞争,例如:
ExecutorService executor = Executors.newFixedThreadPool(10);
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(
    CompletableFuture.supplyAsync(() -> { /* task1 */ }, executor),
    CompletableFuture.supplyAsync(() -> { /* task2 */ }, executor)
);
  1. 优化任务逻辑:拆分长任务为多个小任务并行执行,减少单个任务执行时间。
  2. 异步获取结果:使用 whenComplete() 或 thenApplyAsync() 等异步回调方法,避免阻塞调用线程。

实际业务场景及优势

  1. 电商订单处理
    • 场景:在处理电商订单时,需要同时进行库存检查、用户信用验证、支付处理等任务,只有这些任务都成功,订单才能确认。
    • 优势:可以并行执行这些任务,提高处理效率,减少订单处理时间,同时利用 CompletableFuture 的异常处理机制,统一处理任务执行过程中的异常。
  2. 数据聚合
    • 场景:从多个不同数据源(如数据库、缓存、第三方 API)获取数据,然后将这些数据聚合处理后返回给前端。
    • 优势:并行从多个数据源获取数据,充分利用网络 I/O 等待时间,提高数据获取的整体效率,并且通过 AND 组合确保所有数据都获取成功后再进行聚合处理。