// 核心线程数,线程池默认可以常驻的线程池数
int corePoolSize
// 最大线程数,在线程数 >= corePoolSize 且 workQueue 满的情况下会才会进行线程的创建
int maximumPoolSize
// 默认是非核心线程的最大 idle 时间,如果设置allowCoreThreadTimeOut 为 true 则核心线程也会受到影响
long keepAliveTime, TimeUnit unit
// 任务等待队列
BlockingQueue<Runnable> workQueue,
// 线程工厂,可以自定义线程创建的逻辑
ThreadFactory threadFactory
// 拒绝执行的策略,在线程数 = maximumPoolSize 且队列已满的情况下,新任务的提交将会被拒绝,拒绝将调用 handler 的方法
RejectedExecutionHandler handler
任务提交到线程池中的几种情况
- 当前线程数 < corePoolSize 会进行线程创建,并将此任务作为该线程的初始任务
- 当前线程数 = corePoolSize,且任务队列未满,放入队列中
- 当前线程数 >= corePoolSize 且 < maximumPoolSize 且任务队列已满,将创建新的非核心线程
- 当前线程数已满且队列已满则调用 RejectedExecutionHandler 进行拒绝处理
常态下,在线程达到 core size 之后都是通过 queue 进行任务的提交,queue 的 size 直接反应了当前线程池的任务堆积情况,是线程池处理能力的关键指标,同时线程池的 active count 是指当前线程池的活跃线程数,也同样是关键的性能指标,如有需要可以考虑进行相应的指标监控告警,通常情况下一般会将 core size 与 max size 设置为同一值,java 的线程与操作系统层面的线程一一映射,开销较大,创建销毁的代价比较高,更倾向于基于业务体量合理进行 core size 与 queue size 的配置,而非依赖 max size 进行补救