Executor是一个顶层接口,java通过Executors工厂类提供了newFixThreadPool和newCachedThreadPool等方法,方便创建线程池。
在这里工厂方法底层,实际上都是通过new ThreadPoolExecutor
来完成;
构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
参数 | 作用 |
---|---|
corePoolSize | 核心线程数,如果不设置allowCoreThreadTimeOut 为true ;它将常驻内存 |
maximumPoolSize | 线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。如果使用了==无界的任务队列==这个参数就没用了 |
keepAliveTime | 非核心线程的闲置超时时间,超过这个时间就会被回收。==只针对非核心线程== |
unit | 指定keepAliveTime的单位;比如毫秒 |
workQueue | 线程池中的任务队列.常用的有三种队列,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue。 |
workQueue的作用:
- ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
- LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
- SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。