多线程并发执行任务可显著缩短耗时,关键在于使用线程池科学调度;I/O密集型任务宜配较大核心线程数与有界队列,配合异常捕获、结果聚合及生命周期管理。

直接用多线程并发执行任务,能显著缩短整体耗时,尤其适合多个独立、可并行的子任务。关键不是“开很多线程”,而是用线程池科学调度——复用线程、控制资源、避免创建销毁开销。
把串行调用改成并行提交
比如查订单要依次调商品、物流、用户信息,原来一个接一个跑,总耗时约 1.8 秒;改用线程池后,三个请求同时发起,总耗时接近最慢那个(比如 800ms),提速一倍以上。
- 用 ExecutorService.submit() 提交 Callable 或 Runnable 任务,获取 Future 对象
- 用 CompletableFuture.allOf() 等待全部完成,再统一收集结果
- 避免在主线程里用 Future.get() 逐个阻塞等待,应批量处理或异步回调
选对线程池类型和参数
不同场景适用不同配置。电商接口多数是 I/O 密集型(查库、调远程服务),线程常处于等待状态,可以适当提高并发数。
- CPU 密集型:核心线程数 ≈ CPU 核数 + 1,避免过度切换
- I/O 密集型:核心线程数可设为 2×CPU 核数 ~ 数十,配合有界队列(如 LinkedBlockingQueue(200))
- 拒绝策略建议用 CallerRunsPolicy,让调用方自己执行,防止任务丢失又不压垮系统
注意异常和结果聚合
多线程下某个子任务失败,不能让整个接口报错或卡住。要主动捕获异常,保证其他任务继续执行,并合理返回降级数据。
立即学习“Java免费学习笔记(深入)”;
- 每个 Callable 的 call() 方法内加 try-catch,记录日志并返回默认值(如空物流信息)
- 用 CompletableFuture.exceptionally() 或 handle() 统一兜底处理异常分支
- 结果组装阶段做空值校验,避免 NPE,必要时打点监控失败率
别忘了释放资源和监控
线程池不是“创建了就完事”,长期运行的服务必须规范管理生命周期。
- 应用关闭前调用 executor.shutdown(),再配合 awaitTermination 等待任务结束
- 通过 JMX 或 Actuator 暴露线程池指标(活跃线程数、队列长度、拒绝数),及时发现堆积
- 给线程池命名(用 ThreadFactory),方便日志中区分来源,排查问题更直观


















