简单记录下,配置线程池的时候,各个参数的具体作用
Java util并发包中的线程池配置
参数 | 描述 |
---|---|
corePoolSize | 核心线程数 |
maximumPoolSize | 最大线程数,当核心线程数到达上限后,会在最大线程数范围内,创建新的线程来执行任务 |
keepAliveTime | 空闲线程的存活时间 |
unit | NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS |
workQueue | 阻塞队列,存放待执行的任务(spring的线程池会配置queueCapacity,供配置阻塞队列大小) |
poolSize | 线程池中正在运行状态的线程数量 |
简述
一个真正的线程池配置是需要经过线上吞吐量的测算得来的,corePoolSize
、maximumPoolSize
、以及queueCapacity
之间不宜配置过大或过小。在线程初始化后,当新的任务提交执行,会生成一个核心线程来执行该任务,直至核心线程数量到达corePoolSize
,此时再有任务进来时,会优先放入阻塞队列。当阻塞队列任务满之后(但poolSize
小于maximumPoolSize
),会创建新的线程来执行, 但新线程数量+核心线程数(corePoolSize )不能超过最大线程数(maximumPoolSize )。
线程池处理任务大致分为三种:
poolSize < corePoolSize
当线程池中正在运行的线程数量,小于核心线程数时,会优先选择创建新的线程来执行任务。poolSize == corePoolSize
当任务数量逐渐增多,线程池中运行状态的线程达到了核心线程数,此时如果有新的任务进来,会优先放到阻塞队列中,就像是生产者、消费者模式一样,等已有的核心线程执行完当下的任务后,再从队列中捞一条任务出来执行。workQueue阻塞队列满了
如果阻塞队列满了,这里需要分情况讨论一下:
3.1 corePoolSize < maximumPoolSize
如果阻塞队列满了,但是poolSize还小于最大线程数时,会创建新的线程(非核心线程,选择不同的机制可时非核心线程在keepAliveTime时间过后销毁)来执行阻塞队列中的任务。但总的线程数量不会超过maximumPoolSize。
3.2 corePoolSize == maximumPoolSize
如果阻塞队列满了,poolSize等于最大线程数时,此时如果有任务被提交执行,该任务会被线程池拒绝。