核心线程数corePoolSize
处理任务的核心线程数量,任务优先交由核线程进行处理,核心线程被占满则将新任务放入任务队列。核心线程处理完成当前任务后会从任务队列中取出任务处理。
最大线程数maximumPoolSize
最大线程数=核心线程数+临时线程数,核心线程与任务队列均已被占满,则将新任务交由临时线程处理。临时线程处理完成当前任务后会从任务队列中取出任务处理。
生存时间keepAliveTime
线程的空闲生存时间,临时线程空闲时间超过生存时间则自动销毁线程,核心线程在运行过程中始终存在。
时间单位unit
线程的空闲生存时间keepAliveTime的计量单位。
任务队列workQueue
核心线程已被占满,则其他任务进入任务队列等待处理。任务队列也被占满则创建临时线程将新任务交由临时线程进行处理。任务队列类型根据实际应用场景进行选择,使用有界队列避免出现创建大量线程,从而导致OOM。Java中有许多已经实现的队列类型,均不符合使用场景的话可以自定义队列。
线程工厂threadFactory
通过线程工厂可以在创建线程或线程池时指定有意义的线程名称,方便出错时回溯。线程工厂也可以采用自定义工厂的方式。
拒绝策略handler
当线程池中的线程及任务队列均已达到上限,此时有新任务进入则可以通过拒绝策略进行处理。JDK提供了4种默认的策略:CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy,以上策略在很多场景时不适用的。比较理想的方式是搭建MQ,并将新任务放入到MQ中,等待线程池处理完成部分任务释放资源后重新取回处理。