线程池中ThreadPoolExecutor构造器有7个参数,如下所示。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
//...
}
1. corePoolSize
核心池大小corePoolSize:表示线程池维护线程的最少数量。
2. maximumPoolSize
最大池大小maximumPoolSize:表示线程池维护线程的最大数量
3.workQueue
阻塞队列workqueue:表示如果任务数量超过核心核心池大小,多余任务则添加到阻塞队列中
4. corePoolSize、workQueue、maximumPoolSize的关系
前提假设:向线程池每添加一个任务就sleep。假设任务数与线程数一一对应,每添加一个任务就对应的创建一个线程,并且一直等待其他线程。
因为可能某一个线程执行了两个任务,看不出效果。
a.
if 任务数 <= 核心池大小
则每添加一个任务就会创建一个线程来执行该任务,线程最大数量等于核心池大小
b.
if 任务数 > 核心池大小 && 任务数 <= 核心池大小 + 阻塞队列大小
则线程数量等于核心池大小,其余任务放入到阻塞队列中
c.
if 任务数 > 核心池大小 + 阻塞队列大小 && 任务数 <= 最大池大小
则会创建新的线程来处理新的任务
d.
if 任务数 > 最大池大小
则会采用拒绝策略handler
5. 参数keepAliveTime
6. 参数unit
7. 参数threadFactory
8. 参数handler
keepAliveTime: 线程池维护线程所允许的空闲时间
ThreadFactory: 是一个线程工厂。用来创建线程。这里为什么要使用线程工厂呢?其实就是为了统一在创建线程时设置一些参数,如是否守护线程。线程一些特性等,如优先级。通过这个TreadFactory创建出来的线程能保证有相同的特性。它首先是一个接口类,而且方法只有一个。就是创建一个线程。
unit: 线程池维护线程所允许的空闲时间的单位
handler: 线程池对拒绝任务的处理策略