性能问题点分析
- 线程资源消耗:每个 CompletableFuture 任务默认使用 ForkJoinPool.commonPool() 线程池,高并发时可能导致线程竞争,资源消耗过大。
- 任务阻塞:AND 组合关系意味着所有任务都完成才能继续,若其中有任务执行时间长,会阻塞后续操作,导致整体性能下降。
- 结果获取开销:使用 get() 方法获取任务结果时会阻塞调用线程,可能影响整体并发性能。
针对性优化措施
- 自定义线程池:创建合适大小的自定义线程池,避免 commonPool() 的资源竞争,例如:
ExecutorService executor = Executors.newFixedThreadPool(10);
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(
CompletableFuture.supplyAsync(() -> { /* task1 */ }, executor),
CompletableFuture.supplyAsync(() -> { /* task2 */ }, executor)
);
- 优化任务逻辑:拆分长任务为多个小任务并行执行,减少单个任务执行时间。
- 异步获取结果:使用 whenComplete() 或 thenApplyAsync() 等异步回调方法,避免阻塞调用线程。
实际业务场景及优势
- 电商订单处理:
- 场景:在处理电商订单时,需要同时进行库存检查、用户信用验证、支付处理等任务,只有这些任务都成功,订单才能确认。
- 优势:可以并行执行这些任务,提高处理效率,减少订单处理时间,同时利用 CompletableFuture 的异常处理机制,统一处理任务执行过程中的异常。
- 数据聚合:
- 场景:从多个不同数据源(如数据库、缓存、第三方 API)获取数据,然后将这些数据聚合处理后返回给前端。
- 优势:并行从多个数据源获取数据,充分利用网络 I/O 等待时间,提高数据获取的整体效率,并且通过 AND 组合确保所有数据都获取成功后再进行聚合处理。