线程池七大参数以及线程池工作原理

88 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

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,

银行业务举例

image.png

继续申请则拒绝策略

申请数减少则 keepalivetime一定时间内没有收到其他请求 则会停止线程(也就是让加班的走)

线程池底层工作原理

image.png

1.在创建了线程池后,等待提交过来的任务请求。

2.当调用execute() 方法添加一个请求任务时,线程池会做如下判断:

2.1如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;

2.2如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列; 2.3如果这时候队列满了且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;

2.4如果队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行。

3.当一个线程完成任务时,它会从队列中取下一个任务来执行。

4.当一个线程无事可做超过一定的时间(keepAliveTime) 时,线程池会判断:

如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。

所以线程池的所有任务完成后它最终会收缩到corePoolSize的大小。