概述
平时面试候选人,聊到线程池的时候难免会顺带着考察下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处理被拒绝的任务。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。