• 【详解】ThreadPoolExecutor源码阅读(三)


    系列目录

    线程数量的维护

    线程池的大小有两个重要的参数,一个是corePoolSize(核心线程池大小),另一个是maximumPoolSize(最大线程大小)。线程池主要根据这两个参数对线程池中线程的数量进行维护。

    需要注意的是,线程池创建之初是没有任何可用线程的。只有在有任务到达后,才开始创建线程,并复用线程。

    注:此图不是状态图,不是说添加一个线程就直接到达corePoolSize状态,而是要表示,一直添加线程直到达到corePoolSize。

    注释里也写的很清楚了:

    (1)如果线程数未达核心数,则每接收一个任务就创建一个工作线程(这里把Worker视为工作线程)来处理。

    (2)如果线程数已达到核心数,那就把任务先放入队列。等到有工作线程完成任务了,会自行从队列中取任务做。

    (3)如果任务无法放入队列,如队列是有界队列,且已满。那么就会继续创建工作线程来处理这个任务。注意,这里的新线程已经不是核心线程了。

    (4)如果线程数量已经达到maxPoolSize,这时候就是线程不能再创建了,任务也放不进队列了,就得启动reject策略。默认策略是AbortPolicy,也就是直接报异常。

    public void execute(Runnable command) {
        //非空检查
        if (command == null)
            throw new NullPointerException();
        
        //获取线程池控制信息
        int c = ctl.get();
        //通过workerCountOf方法获取控制信息内的工作线程数信息
        //如果小于核心线程数,执行addWorker方法    0 => corePoolSize
        if (workerCountOf(c) < corePoolSize) {    
            //这个操作添加的是核心工作线程,且有初始任务
            if (addWorker(command, true))
                return; //如果操作成功直接返回
            //由于addWorker操作对工作线程数,可能有所更改,故重新获取控制信息
            c = ctl.get();
        }
    
        //添加核心线程失效后
        //如果线程池处于运行状态,且任务成功加入阻塞队列   corePoolSize => corePoolSize
        if (isRunning(c) && workQueue.offer(command)) {  
            //再次检查线程池状态
            int recheck = ctl.get();
            //如果线程池处于非运行状态,则把刚刚加入队列的任务移除
            if (! isRunning(recheck) && remove(command))
                //执行拒绝策略
                reject(command);
            //当前没有工作者线程,则添加非核心线程
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        //如果任务未能加入阻塞队列,则添加非核心线程   corePoolSize => maxPoolSize
        //如果添加非核心线程也失败,开启拒绝策略
        else if (!addWorker(command, false))
            reject(command);      //maxPoolSize => maxPoolSize
    }
  • 相关阅读:
    Node.js 回调函数
    算法二、
    一、Perfect Squares 完全平方数
    Never Go Away
    python 内置方法
    web框架详解之tornado 三 url和分页
    web框架详解之tornado 二 cookie
    前端各种插件
    AJAX请求时status返回状态明细表
    LR之-参数化
  • 原文地址:https://www.cnblogs.com/longfurcat/p/9897753.html
Copyright © 2020-2023  润新知