【详解】ThreadPoolExecutor源码阅读(三)
2018-11-02 18:29
176 查看
系列目录
- 【详解】ThreadPoolExecutor源码阅读(一)
- 【详解】ThreadPoolExecutor源码阅读(二)
- 【详解】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 }
相关文章推荐
- TiDB 源码阅读系列文章(十六)INSERT 语句详解
- Tomcat中session详解(源码阅读)
- [RK3288][Android7.1.2] Launcher3 源码阅读之step3:详解Launcher的OnCreate方法的B部分
- tomcat源码阅读(二) Digester方法详解
- 阅读Linux设备驱动模型源码之 device结构体成员详解
- Ubuntu下android-4.0.3_r1源码下载,阅读工具安装配置,源码编译详解
- Tomcat中Lifecycle详解(源码阅读)
- Android源码阅读与理解(二):Android系统Build流程详解
- jdk源码阅读Collection详解
- Volley源码阅读详解(一)---网络任务分发,处理和交付的核心流程
- [RK3288][Android7.1.2] Launcher3 源码阅读之step2:详解Launcher的OnCreate方法的A部分
- ThinkPHP源码阅读2-----C函数配置文件详解
- 【详解】ThreadPoolExecutor源码阅读(一)
- 【详解】ThreadPoolExecutor源码阅读(二)
- [RK3288][Android7.1.2] Launcher3 源码阅读之step4:详解Launcher的OnCreate方法的C部分
- caffe源码阅读(1)_整体框架和简介(摘录)
- Linux核心源码阅读方法
- 详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
- lower_bound()和upper_bound()详解(附源码)
- Android系统源码阅读(6):广播机制