本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
ThreadPoolExecutor this构造方法重载
public ThreadPoolExecutor(int corePoolSize,int maximumPoolsize, long keepAliveTime ,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadF actory,
RejectedExecut ionHandler handler) {
if (corePoolSize < 0||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolsize|川|
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == nu1l|I threadFactory == null|| handler == null)
throw new NullPointerException() ;
this. corePoolsize = corePoolsize;
this . maximumPoolSize = maximumPoolSize;
this . workQueue = workQueue ;
this. keepAliveTime = unit . toNanos(keepAliveTime);
this. threadFactory = threadFactory;
this.handler = handler;
}
七参数理论 大于等于线程池的最大线程数(maximumPoolsize)时如何来拒绝请求执行的runnable的策略
corePoolsize:线程池中的常驻核心线程数
1在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程
2当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
keepalivetime
默认情况下: 只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,
银行业务举例
继续申请则拒绝策略
申请数减少则 keepalivetime一定时间内没有收到其他请求 则会停止线程(也就是让加班的走)
线程池底层工作原理
1.在创建了线程池后,等待提交过来的任务请求。
2.当调用execute() 方法添加一个请求任务时,线程池会做如下判断:
2.1如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;
2.2如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列; 2.3如果这时候队列满了且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
2.4如果队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行。
3.当一个线程完成任务时,它会从队列中取下一个任务来执行。
4.当一个线程无事可做超过一定的时间(keepAliveTime) 时,线程池会判断:
如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。
所以线程池的所有任务完成后它最终会收缩到corePoolSize的大小。