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;
}

ThreadPoolExecutor参数解释

ThreadPoolExecutor总共有七个参数,每个参数都对线程池的性能有很大的的影响,线面就让我们来看一个各个参数的意思。

corePoolSize-保留在池中的核心线程数(即使它们处于空闲状态),除非allowCoreThreadTimeOut已设置

maximumPoolSize -池中允许的最大线程数

keepAliveTime -当线程数大于核心线程数数时,如果线程池中的最大线程数大于核心线程数,那么这个时间就是

(maximumPoolSize-corePoolSize)的线程在终止之前等待新任务的最长时间。

unit-keepAliveTime参数的时间单位

workQueue-在执行任务之前用于保留任务的队列。该队列将仅保存Runnableexecute方法提交的任务。

threadFactory -执行程序创建新线程时要使用的工厂

handler -因为达到了线程界限和队列容量而在执行被阻止时使用的处理程序

核心线程数(corePoolSize)和最大线程数之间(maxinumPoolSize)工作队列(workQueue)的关系

1:当提交给线程池任务时,如果没有空闲线程执行任务并且当前线程池中的线程数少于corePoolSize,则创建新的线程执行任务。

2:当提交给线程池任务时,如果没有空闲线程执行任务并且当前线程池中的线程数等于corePoolSize,若workQueue未满时,则把任务放入workQueue中。

3:当提交给线程池任务时,如果没有空闲线程执行任务并且当前线程池中的线程数等于corePoolSize且小于maximumPoolSize时,若workQueue已满时,则创建新的线程执行任务。

(4)当提交给线程池任务时,如果没有空闲的线程执行该任务且阻塞队列已满同时池中的线程数等于maximumPoolSize,则根据构造函数中的handler指定的策略来拒绝新的任务。

注意,线程池并没有标记哪个线程是核心线程,哪个是非核心线程,线程池只关心核心线程的数量

拒绝策略(RejectedExecutionHandler)

拒绝策略总共有四种,都是ThreadPoolExecutor的内部类,可以RejectedExecutionHandler参考代码的实现类,代码很少,很容易能看懂;

static class ThreadPoolExecutor.AbortPolicy抛出的被拒绝任务的处理程序 RejectedExecutionException
static class ThreadPoolExecutor.CallerRunsPolicy拒绝任务的处理程序,直接在方法的调用线程中运行拒绝任务execute,除非执行器已关闭,在这种情况下,该任务将被丢弃。
static class ThreadPoolExecutor.DiscardOldestPolicy拒绝任务的处理程序,它丢弃最旧的未处理请求,然后重试execute,除非执行器被关闭,在这种情况下,该任务将被丢弃。
static class ThreadPoolExecutor.DiscardPolicy拒绝任务的处理程序,静默丢弃被拒绝的任务。

线程池的状态

注意这里指的是线程池的状态,而不是线程的状态。

线程池具有以下五种状态,当创建一个线程池时初始化状态为RUNNING

RUNNING 允许提交并处理任务
SHUTDOWN 不允许提交新的任务,但是会处理完已提交的任务
STOP 不允许提交新的任务,也不会处理阻塞队列中未执行的任务,并设置正在执行的线程的中断标志位
TIDYING 所有任务执行完毕,池中工作的线程数为0,等待执行terminated()勾子方法
TERMINATED terminated()勾子方法执行完毕

线程池的状态主要是有这一个变量来控制的,private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

ctl主要用于存储线程池的工作状态以及池中正在运行的线程数。要在一个整型变量存储两个数据,只能将其一分为二。其中高3bit用于存储线程池的状态,低位的29bit用于存储正在运行的线程数。具体的解释可以参考源码的注释。

线程池状态变化

调用线程池的shutdown方法,将线程池由RUNNING(运行状态)转换为SHUTDOWN状态。

调用线程池的shutdownNow方法,将线程池由RUNNING或SHUTDOWN状态转换为STOP状态。

SHUTDOWN状态和STOP状态先会转变为TIDYING状态,最终都会变为TERMINATED。

ThreadPoolExecutor参数详解的更多相关文章

  1. 【并发编程】ThreadPoolExecutor参数详解

    ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long ke ...

  2. Nginx主配置参数详解,Nginx配置网站

    1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...

  3. iptables参数详解

    iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...

  4. chattr的常用参数详解

    chattr的常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际生产环境中,有的运维工程师不得不和开发和测试打交道,在我们公司最常见的就是部署接口.每天每个人部署的 ...

  5. mha配置参数详解

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  6. $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解

    [一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...

  7. linux PHP 编译安装参数详解

    linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

  8. 【转】jqGrid 各种参数 详解

      [原文]http://www.cnblogs.com/younggun/archive/2012/08/27/2657922.htmljqGrid 各种参数 详解 JQGrid JQGrid是一个 ...

  9. HTML滚动字幕代码参数详解及Js间隔滚动代码

    html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...

随机推荐

  1. sql常识-RIGHT JOIN

    SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行. RIGHT JOIN ...

  2. 三、jmeter常用的元件及组件

    一.HTTP cookie Manager 用来储浏览器产生的用户信息,Stepping Thread Group 可用于模拟阶梯加压! 二.HTTP Cache Manager 缓存管理器(模拟浏览 ...

  3. 【js】Leetcode每日一题-二叉树的堂兄弟节点

    [js]Leetcode每日一题-二叉树的堂兄弟节点 [题目描述] 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处. 如果二叉树的两个节点深度相同,但 父节点不 ...

  4. vue2.0与3.0响应式原理机制

    vue2.0响应式原理 - defineProperty 这个原理老生常谈了,就是拦截对象,给对象的属性增加set 和 get方法,因为核心是defineProperty所以还需要对数组的方法进行拦截 ...

  5. [bug] C++:[Error] name lookup of 'i' changed for ISO '

    错误原因:变量i只在for循环中可见,若在循环外使用需要单独定义 1 #include <iostream> 2 using namespace std; 3 4 int main(){ ...

  6. 『动善时』JMeter基础 — 25、JMeter参数化补充练习

    目录 1.使用"CSV数据文件设置"组件实现参数化 (1)测试计划中的元件 (2)数据文件内容 (3)线程组元件内容 (4)HTTP信息头管理器组件内容 (5)CSV数据文件设置组 ...

  7. 高德Serverless平台建设及实践

    导读 高德启动Serverless建设已经有段时间了,目前高德Serverless业务的峰值早已超过十万QPS量级,平台从0到1,QPS从零到超过十万,成为阿里集团内Serverless应用落地规模最 ...

  8. 3d分层悬停效果

    3d分层悬停效果 写在前面 经过了2个星期的努力,我回来了!会继续将我学习路上遇到的问题,以及一些笔记,demo分享给大家 实现效果 致我最爱的backpink 实现思路 将6张图片,通过定位叠在一起 ...

  9. Ubuntu 16.04安装PyCharm

    PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...

  10. GO学习-(24) Go语言操作Redis

    Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...