并发工具类对比与实践
一个接口需要调用 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——异步编排,功能最全
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!