系列目录

线程数量的维护

线程池的大小有两个重要的参数,一个是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) == )
addWorker(null, false);
}
//如果任务未能加入阻塞队列,则添加非核心线程 corePoolSize => maxPoolSize
//如果添加非核心线程也失败,开启拒绝策略
else if (!addWorker(command, false))
reject(command); //maxPoolSize => maxPoolSize
}

最新文章

  1. Go语言 数组
  2. JavaScript笔记基础篇(三)
  3. JAVA可移植性广泛应用
  4. SaltStack之Job管理和Runner(八)
  5. iperf3实践
  6. TinyXML 在vs2010 VC++使用
  7. 黄聪:主机宝IIS版ISAPIRewrite伪静态软件操作演示
  8. xsheell的下载安装初级使用
  9. win7安装office2007出错被中断-已经解决
  10. HTML5每日一练之input新增加的5种其他类型1种标签应用
  11. WTL 自定义 Button类-自绘
  12. css 文本域textarea显示成label标签
  13. jQuery中设置form表单中action值的方法
  14. Linux挂载硬盘出错:$LogFile indicates unclean shutdown (0, 0)
  15. 我的小工具开源一下-PingTest
  16. fedora下一些问题的解决方案汇总
  17. 为shell布置陷阱:trap捕捉信号方法论
  18. Java安装和环境变量配置
  19. vue中的数据监听以及数据交互
  20. 微博第三方js-sdk登录

热门文章

  1. Java中方法重写和方法重载
  2. 【Andorid开发框架学习】之Mina开发之Mina简介
  3. hdu 1.2.4
  4. 在windows10上创建ASP.NET mvc5+Memcached服务
  5. EMACS快捷键
  6. 【BZOJ3545】 [ONTAK2010]Peaks
  7. Python3.5 学习二十一
  8. PHP eval函数
  9. Flask中的before_request和after_request
  10. 深入字节码理解invokeSuper无限循环的原因