ThreadPoolExecutor机制 
一、概述 
1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; 
2、Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。 
3、先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池

二、核心构造方法讲解 
下面是ThreadPoolExecutor最核心的构造方法

public ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize,  long keepAliveTime,  TimeUnit unit,  BlockingQueue<Runnable> workQueue,  ThreadFactory threadFactory,  RejectedExecutionHandler handler) {  if (corePoolSize < 0 ||  maximumPoolSize <= 0 ||  maximumPoolSize < corePoolSize ||  keepAliveTime < 0)  throw new IllegalArgumentException();  if (workQueue == null || 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;  } 

构造方法参数讲解 

参数名 作用
corePoolSize 核心线程池大小
maximumPoolSize 最大线程池大小
keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit keepAliveTime时间单位
workQueue 阻塞任务队列
threadFactory 新建线程工厂
RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理

 

重点讲解: 
其中比较容易让人误解的是:corePoolSize,maximumPoolSize,workQueue之间关系。

1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。并处理请求。

2.当线程池等于corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行。池子里的空闲线程就去从workQueue中取任务并处理。

3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会继续创建新线程执行任务。 因为还有maximumPoolSize等着被使用,只是优先使用corePoolSize

4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler来做拒绝处理

5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

7.当池子的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁

线程管理机制图示: 

转自:

http://blog.csdn.net/cutesource/article/details/6061229

http://blog.csdn.net/cutesource/article/details/6061229

感谢!

转载于:https://www.cnblogs.com/Donnnnnn/p/7237873.html

ThreadPoolExecutor运转机制详解相关推荐

  1. ThreadPoolExecutor运转机制详解(转)

    总结:看了下文后,发现用这个线程池,还是得用上那个异常处理,再自己重写,异常时的处理.这样才不会丢任务. 原文:http://blog.csdn.net/cutesource/article/deta ...

  2. PHP autoload机制详解

    PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...

  3. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

    先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...

  4. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

  5. Numpy的广播机制详解(broadcasting)

    Numpy的广播机制详解(broadcasting) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数 ...

  6. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

  7. java异常处理机制详解

    java异常处理机制详解 参考文章: (1)java异常处理机制详解 (2)https://www.cnblogs.com/vaejava/articles/6668809.html 备忘一下.

  8. SpringMVC异常处理机制详解[附带源码分析]

    SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...

  9. 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...

  10. JAVA之JVM垃圾回收(GC)机制详解

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

最新文章

  1. 智能驾驶操作系统OS
  2. 电脑画画软件_手绘、板绘、还有用pad画画都有啥区别?
  3. udp模拟tcp java_Java简单实现UDP和TCP
  4. [再寄小读者之数学篇](2014-11-14 矩阵的应用: 有限几何)
  5. win11如何自动启用禁用设置时区 windows11自动启用禁用设置时区的步骤方法
  6. allennlp 版本关系
  7. python爬虫实例评论_python爬取微博评论的实例讲解
  8. 一起学JAVA 接口 面向接口开发
  9. 浅谈怎样入侵服务器,仅供学习用
  10. 计算机节能+关闭硬盘,优化三:CPU节能关闭_固态硬盘-中关村在线
  11. 计算机如何把应用储存进u盘,怎样把word中的内容保存进u盘 怎样把word文档放到u盘里?...
  12. 计算机教室云教学反思,《观察云》教学反思
  13. MySQL架构 数据库(1)
  14. 使用canal1.1.5让MySQL5.7同步到ES7.x
  15. android 粒子爆炸特效
  16. 在ArcGIS Pro2.2中玩转聚焦地图
  17. 国讯通用OA协同办公系统源码
  18. 零基础,如何学习CAD和3Dmax,有什么学习计划吗?
  19. 全网流行的黑白照片上色技术,看看飞桨开发者是如何实现的
  20. 焦化厂有害气体检测传感器选型

热门文章

  1. VB API 之 第七课 字体应用四
  2. $(function() {});和$(document).ready(function() {});区别
  3. Linux-安装python3环境
  4. php值传递和引用传递
  5. Handsontable 自定义菜单 自定义命令存放位置
  6. Mybatis接口方式
  7. hge引擎写的一个扫雷小游戏
  8. 一个景点的给input域一个默认值,然后在聚焦的时候清空它 jquery方法
  9. 2018大盘点 | R语言中文社区十大火爆文章
  10. 如何使用 ggplot2 ?