ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
参数介绍
- corePoolSize
线程池的核心线程数:当有任务到线程池,会创建线程去完成这个任务,即使目前线程池里有空闲的线程也会创建线程,当执行的任务数大于核心线程数的时候就不会创建。
- maximumPoolSize
最大线程数:若果队列满了,并且已经创建的线程数小于最大线程数,则创建新的线程。适用于有界队列。
- keepAliveTime
线程活动时间:线程空闲后存活的时间。时间到了,如果超过线程核心数,会销毁线程。保存corePoolSize
如果任务很多建议调大,保证线程利用率。
- unit
线程空闲后存活的时间单位
- workQueue
- ArrayBlockingQueue 有界阻塞队列
- LinkedBlockingQueue 无界阻塞队列 吞吐量高于ArrayBlockingQueue
- SynchronousQueue 一个只存储一个元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入一直处于阻塞状态,吞吐量高于LinkedBlockingQueue,Executors#newCachedThreadPoll()使用了这个队列
- PriorityBlockingQueue 具有优先级的阻塞队列
线程变化
- 当线程数小于核心线程数时,新建任务提交到线程池,即使有空闲线程也会创建新的线程。
- 当线程数大于核心线程数时,新建任务提交到线程池,会把任务放到任务队列中,等待被调度。
- 当队列已满,且maximumPoolSize>corePoolSize,新建任务提交到线程池,会新建线程。
- 当提交任务数大于maximumPoolSize,会交给RejectedExecutionHandler处理。
- 当线程池中的数目大于corePoolSize 空闲时间达到keepAliveTime会关闭空闲线程。
- 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭。