前言
从Java线程池及用法 一文中我们知道,Java提供了4个常用的线程池。但是在如下场景的的时候,就需要我们使用自定义ThreadPoolExecutor和BlockingQueue队列结合使用来处理。
需要的子线程数量很多,但是数量不确定。
子线程有自己的优先级,根据优先级来确定执行的先后顺序。
监听线程池的开始,结束,关闭等状态。
ThreadPoolExecutor
构造方法
//使用给定的初始参数和默认线程工厂以及拒绝的执行处理程序创建新的ThreadPoolExecutor。
//使用Executors工厂方法之一代替此通用构造函数可能更方便。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue)
//使用给定的初始参数和默认拒绝执行处理程序创建新的ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory)
//使用给定的初始参数和默认线程工厂创建一个新的code ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
RejectedExecutionHandler handler)
//使用给定的初始参数创建一个新的ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
主要参数
corePoolSize:核心线程数
核心线程会一直存活,及时没有任务需要执行。当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。
maxPoolSize:最大线程数
当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。
当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。
keepAliveTime:非核心线程闲置时的超时时长
超过这个时长,非核心线程就会被回收。当ThreadPoolExecutor的allowCoreThreadTimeOu