/**
* 用给定的初始参数创建一个新的ThreadPoolExecutor。
*/
public ThreadPoolExecutor(int corePoolSize,//线程池的核心线程数量
int maximumPoolSize,//线程池的最大线程数
long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间
TimeUnit unit,//时间单位
BlockingQueue<Runnable> workQueue,//任务队列,用来储存等待执行任务的队列
ThreadFactory threadFactory,//线程工厂,用来创建线程,一般默认即可
RejectedExecutionHandler handler//拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务
) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
ThreadPoolExecutor3个重要参数:
corePoolSize:核心线程数,线程数定义了最小可以同时运行的线程数量;
maximumPoolSize:当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数;
workQueue:当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到,任务就会被存放再队列中;
ThreadPoolExecutor 其他常见参数:
1、KeepAliveTime:当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,
而是会等待,直到等待时间超过了keepAliveTime才会被回收销毁;
2、unit:keepAliveTime参数的时间单位;
3、threadFactory:executor创建新线程的时候会被用到;
4、handler:饱和策略。
ThreadPoolExecutor饱和策略定义:
如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任务时,ThreadPoolExecutor定义的策略:
1、ThreadPoolExecutor.AbortPolicy:抛出rejectedExecutionException来拒绝新任务的处理;
2、ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务。这种策略会降低对于新任务提交速度,影响程序的整体性能;
这个策略喜欢增加队列容量;
3、ThreadPoolExecutor.DiscardPolicy:不处理新任务,直接丢弃掉;
4、ThreadPoolExecutor.DiscardOldestPolicy:此策略将丢弃最早的未处理的任务请求;
Spring通过ThreadPoolTaskExecutor的创建线程池时,当我们不指定RejectedExecutionHandler饱和策略的话来配置线程池时,默认使用的是
ThreadPoolExecutor.AbortPolicy;