阿里的规范是使用new ThreadPoolExecutor()来创建线程池,二不是使用Excutor的静态工具类来创建线程池,具体可以查看博客(两篇):
https://blog.csdn.net/angus_Lucky/article/details/79862491
https://blog.csdn.net/qq_31615049/article/details/80756781
,以及博客中有详解介绍
关于线程池ThreadPoolExecutor,其总共有四个构造器,其中最完整的一个构造方法为如下:
public ThreadPoolExecutor(int corePoolSize, //核心线程池数量
int maximumPoolSize, //最大线程池大小
long keepAliveTime, //线程池中超过 corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit unit, //keepAliveTime时间单位
BlockingQueue<Runnable> workQueue, //阻塞任务队列
ThreadFactory threadFactory, //新建线程工厂
RejectedExecutionHandler handler) {...} //当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
关于其中的参数介绍:
一:ThreadPoolExecutor的重要参数
corePoolSize:核心线程数
核心线程会一直存活,及时没有任务需要执行
当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理
设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
queueCapacity:任务队列容量(阻塞队列)
当核心线程数达到最大时,新任务会放在队列中排队等待执行
maxPoolSize:最大线程数
当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务
当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常
keepAliveTime:线程空闲时间
当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
如果allowCoreThreadTimeout=true,则会直到线程数量=0
allowCoreThreadTimeout:允许核心线程超时
rejectedExecutionHandler:任务拒绝处理器
两种情况会拒绝处理任务:
当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务
当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务
线程池会调用rejectedExecutionH