一个接口需要调用 3 个微服务,串行 300ms。用 CompletableFuture 并行调用只需 120ms。

一、场景描述

  • 1.1 商品详情页——需要商品信息、库存、评价、推荐
  • 1.2 串行调用——逐个等待,时间累加
  • 1.3 并行调用的收益——总时间 = max(每个调用的时间)

二、CountDownLatch

  • 2.1 原理——计数器,主线程等待所有子任务完成
  • 2.2 代码示例——3 个线程并行获取数据
  • 2.3 缺点——无法获取返回值、只能使用一次

三、CyclicBarrier

  • 3.1 原理——所有线程到达 barrier 后一起继续
  • 3.2 与 CountDownLatch 的区别——可重用、可执行回调
  • 3.3 适用场景——分阶段并行计算

四、CompletableFuture(推荐)

  • 4.1 基本使用——supplyAsync() + thenApply() + thenCombine()
  • 4.2 并行调用——多个 CompletableFuture + allOf()
  • 4.3 获取结果——join() 等待所有完成
  • 4.4 异常处理——exceptionally() / handle()

五、实战案例

  • 5.1 商品详情页的并行化改造
  • 5.2 代码——串行版 vs 并行版
  • 5.3 性能对比——300ms → 120ms
  • 5.4 自定义线程池——避免使用公共 ForkJoinPool

六、注意事项

  • 6.1 线程池隔离——不要用公共池
  • 6.2 超时控制——get(timeout, unit)
  • 6.3 异常传播——allOf() 不会主动抛出异常
  • 6.4 资源释放——合理设置线程池大小

七、总结

  • CountDownLatch——简单等待
  • CyclicBarrier——分阶段协同
  • CompletableFuture——异步编排,功能最全