概述
平时面试候选人,聊到线程池的时候难免会顺带着考查下ThreadPoolExecutor构造函数中各参数的含意,在这里做一个简略的总结。
ThreadPoolExecutor结构参数阐明
其实从源码中的JavaDoc曾经能够很清晰地明确这些参数的含意了,上面关照懒得看英文的同学,再解释一下:
- corePoolSize
线程池外围线程数。
默认状况下外围线程会始终存活,即便处于闲置状态也不会受存keepAliveTime
限度,除非将allowCoreThreadTimeOut
设置为true
。
- maximumPoolSize
线程池所能包容的最大线程数。超过maximumPoolSize
的线程将被阻塞。
最大线程数maximumPoolSize
不能小于corePoolSize
- keepAliveTime
非核心线程的闲置超时工夫。
超过这个工夫非核心线程就会被回收。
- TimeUnit
keepAliveTime
的工夫单位,如TimeUnit.SECONDS。
当将allowCoreThreadTimeOut
为true时,对corePoolSize失效。
- workQueue
线程池中的工作队列。
没有取得线程资源的工作将会被放入workQueue
,期待线程资源被开释。如果放入workQueue
的工作数大于workQueue
的容量,将由RejectedExecutionHandler
的回绝策略进行解决。
罕用的有三种队列: SynchronousQueue
,LinkedBlockingDeque
,ArrayBlockingQueue
。
- threadFactory
提供创立新线程性能的线程工厂。
ThreadFactory
是一个接口,只有一个newThread
办法:
Thread newThread(Runnable r);复制代码
- rejectedExecutionHandler
无奈被线程池解决的工作的处理器。
个别是因为工作数超出了workQueue
的容量。
当一个工作被退出线程池时
总结一下,当一个工作通过execute(Runnable)
办法增加到线程池时:
- 如果此时线程池中线程的数量小于
corePoolSize
,即便线程池中的线程都处于闲暇状态,也要创立新的线程来解决被增加的工作。 - 如果此时线程池中的数量等于
corePoolSize
,然而缓冲队列workQueue
未满,那么工作被放入缓冲队列。 - 如果此时线程池中的数量大于
corePoolSize
,缓冲队列workQueue
满,并且线程池中的数量小于maximumPoolSize
,建新的线程来解决被增加的工作。 - 如果此时线程池中的数量大于
corePoolSize
,缓冲队列workQueue
满,并且线程池中的数量等于maximumPoolSize
,那么通过 handler所指定的回绝策略来解决此工作。
解决工作的优先级为:外围线程数(corePoolSize) > 工作队列容量(workQueue) > 最大线程数(maximumPoolSize);如果三者都满了,应用rejectedExecutionHandler解决被回绝的工作。
参考文档
- Java并发 之 线程池系列 (2) 应用ThreadPoolExecutor结构线程池