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-在执行任务之前用于保留任务的队列。该队列将仅保存Runnable 该execute方法提交的任务。

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. python模块一之faker模块

    faker模块主要是用来创建伪数据,无需手动生成或者手写随机数来生成数据,可以利用faker完成伪造大量测试数据的工作 一.安装 pip install faker 二.使用 from faker i ...

  2. Postman报文进行解密之RSA私钥解密

    接口返回的数据也是加密的,需要对数据解密才能看到返回的数据是否正确,就需要用RSA解密. 返回数据的解析可以在postman的Tests进行后置处理,获取加密后的返回数据: var data = JS ...

  3. 关于MDI多文档程序的一些思考

    MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...

  4. I/O流以及文件的基本操作

    文件操作: 文件操作其实就是一个FIle类:我们学习文件操作就是学习File类中的方法: 文件基操: 第一部分:学习文件的基本操作(先扒源码以及文档) Constructor Description ...

  5. [CSS属性设置,盒子模型,网页布局]

    [CSS属性设置,盒子模型,网页布局] CSS属性设置 1. 宽和高 width:属性可以为元素设置宽度. height:属性可以为元素设置高度. 块级标签的宽度不修改的情况下默认占浏览器的一整行,块 ...

  6. margin (子元素远离父元素边框)

    如果父盒子没有设置border框着,那么他的子元素无法利用margin-top 来远离父元素的上边框 如果使用了margin-top会使子元素和父元素一起往下移 (子想离,父不设置border边框 则 ...

  7. powercli创建虚拟机步骤及批量创建脚本

    https://pubs.vmware.com/vsphere-51/index.jsp?topic=%2Fcom.vmware.powercli.cmdletref.doc%2FSet-OSCust ...

  8. Zabbix 监控介绍

    Zabbix 监控介绍 1.Zabbix监控架构 2.Zabbix 优点 开源无软件成本投入 Server对设备性能要求低 支持设备多,自带多种监控模板 支持分布式集中管理,有自动发现功能,可以实现自 ...

  9. WIFF SD卡

    https://detail.tmall.com/item.htm?spm=a230r.1.14.1.2d4d6923Fq3Hgx&id=36945441834&cm_id=14010 ...

  10. Linux shell用sed批量更改文件名的相关内容

    示例 去除特定字符 目标:将指定目录下文件名中sprint替换为dev 方法: [root@Skip-ftp test]# for i in `ls` > do > name=`echo ...