一.线程池的配置参数
通过对创建线程池的ThreadPoolExecutor类源码阅读我们发现,创建线程池会传入七个参数,让我们来依次了解一下各个参数的具体含义:
corePoolSize:核心线程数,可以理解为线程池维护的最小线程数量,核心线程创建后不会被回收。大于核心线程数的线程,在空闲时间超过keepAliveTime后会被回收。
maximumPoolSize:最大线程数,线程池允许创建的最大线程数量;(包含核心线程池数量)
keepAliveTime:非核心线程存活时间,当一个可被回收的线程的空闲时间大A于keepAliveTime,就会被回收。
unit:非核心线程存活时间的时间单位
workQueue:工作队列,用于存储等待执行的线程任务
threadFactory:线程工厂,用于创建线程,以及自定义线程名称,需要实现ThreadFactory接口;
RejectedExecutionHandler:拒绝策略,当线程池线程内的线程耗尽,并且工作队列达到已满时,新提交的任务,将使用拒绝策略进行处理。
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.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
二.线程池的执行流程
了解了线程池的创建参数,我们便可以得知线程执行流程的各个关键节点,首先当提交了一下新的线程任务时,会对线程的当前存活线程数进行判断,如果小于核心线程数,则分配线程执行线程任务,否则会将提交的线程任务放入工作队列中等待线程任务的执行,如果工作队列已满,则会判断当前存活线程数是否小于最大线程数,如果小于最大线程数,则创建新的线程来执行线程任务,否则会对线程任务执行拒绝策略。