概述
平时面试候选人,聊到线程池的时候难免会顺带着考查下 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 结构线程池