前言:线程池概念的类图如下所示,Executor接口只定义了run方法,由java doc知,目的是为了将任务的提交和执行解耦,通过逐层加方法,一直达到ThreadPoolExecutor类。本文不讲解相关设计层次,只关注ThreadPoolExecutor类。
ThreadPoolExecutor
通用构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
int corePoolSize: 核心线程数。每到来一个任务,开启一个线程去执行,直到开启的线程数达到核心线程数;任务结束,核心线程数内的线程不回收。
BlockingQueue workQueue: 阻塞队列(线程安全)。核心线程数内无线程去承接任务时,任务将被线程池保存在阻塞队列内,直到达到队列的size。
int maximumPoolSize: 最大线程数。阻塞队列内任务达到size时,若最大线程数大于核心线程数,则额外开启线程去执行新到来的任务,直到达到最大线程数。
long keepAliveTime:存活时间。最大线程数与核心线程数之间的线程空闲时间,达到则被回收。
TimeUnit unit: 时间单位。对应于keepAliveTime。
ThreadFactory threadFactory: 线程的创建工厂,通常用于自定义创建的线程名。
RejectedExecutionHandler handler:拒绝策略当线程数达到最大线程数时,将按照拒绝策略,拒绝新到来的任务。
拒绝策略
ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy: 也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy: 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy: 由调用线程处理该任务
PS: 还可以自己实现RejectedExecutionHandler接口,并setRejectedExecutionHandler(RejectedExecutionHandler handler),实现自己的拒绝策略。
线程池的关闭
shutdown(): 而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow(): 立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务