线程池的价值在于复用线程、限制并发、管理任务队列。理解线程池参数,比记住某个固定配置更重要。

核心参数

ThreadPoolExecutor 常见参数包括:

  • corePoolSize:核心线程数;
  • maximumPoolSize:最大线程数;
  • keepAliveTime:非核心线程空闲存活时间;
  • workQueue:任务队列;
  • threadFactory:线程创建方式;
  • handler:拒绝策略。

这些参数共同决定任务来了之后如何排队、扩容和拒绝。

任务提交后的流程

一个简化流程是:

  1. 当前线程数小于 corePoolSize,创建核心线程执行;
  2. 核心线程已满,任务进入队列;
  3. 队列满了,尝试创建非核心线程,直到 maximumPoolSize
  4. 仍然无法处理,触发拒绝策略。

因此队列类型会影响最大线程数是否容易生效。无界队列可能让任务一直排队,导致最大线程数很少被用到。

CPU 密集与 IO 密集

CPU 密集任务主要消耗计算资源,线程数通常接近 CPU 核心数。IO 密集任务经常等待网络或磁盘,可以使用更多线程,但也不能无限增加。

判断线程数是否合理,最好结合实际指标:CPU 使用率、队列长度、响应时间、拒绝次数。

拒绝策略不是摆设

拒绝策略代表系统过载时的行为。常见策略包括抛异常、调用者执行、丢弃任务等。不同场景应选择不同策略,不能只把队列调大来掩盖问题。

小结

线程池配置没有万能公式。核心思路是限制并发、控制排队、明确过载行为,并通过监控数据持续调整。