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. C#中的元组(Tuple)和结构体(struct)

    在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应 ...

  2. 33.2.NIO

    4.1概述[理解] BIO Blocking IO,阻塞型IO NIO No Blocking IO,非阻塞型IO 阻塞IO的弊端 在等待的过程中,什么事也做不了 非阻塞IO的好处 不需要一直等待,当 ...

  3. CentOS 7配置静态IP地址的两种方法 来自:互联网

    CentOS 7配置静态IP地址的两种方法 来自:互联网 时间:2021-01-12 阅读:4 如果你想要为CentOS 7中的某个网络接口设置静态IP地址,有几种不同的方法,这取决于你是否想要使用网 ...

  4. tar cf XXX.tar /tmp /var 日志保存

    tar cf XXX.tar /tmp /var 检测tar tf XXX.tar /tmp /var  

  5. 攻防世界(六)supersqli

    攻防世界系列:supersqli 方法一: 用逗号包裹回显正常,说明存在注入 1';--+(注释符也可用 -- 或 # 发现均未被过滤!) 有order by 语句可知表由2个字段,使用联合查询 (想 ...

  6. shell基础之函数

    shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式: func() { #指定函数名 command # ...

  7. shell初学之nginx(域名)

    创建两个以域名区分的虚拟网站: 1 #!/bin/bash 2 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...

  8. Java EnumMap 实现类

    EnumMap 实现类 因为 HashMap 是一种通过对 key 计算 hashCode(),通过空间换时间的方式,直接定位到 value 所在的内部数组的索引,因此,查找效率非常高. 如果作为 k ...

  9. 电路调试检测维修总结积累 20181015 板子:3060-A

    今天在检修一块3060-A电路板时 发现   3.3V烫 但是3.3V路上的电容并没有短路 于是拆单片机   拆RS232EN  拆  FM24V 最后发现  原来是  1117-3.3  处的33U ...

  10. C++ short/int/long/long long 等数据类型大小

    表 1 整型数据类型 数据类型 字节大小 数值范围 short int (短整型) 2 字节 -32 768 〜+32 767 unsigned short int(无符号短整型) 2 字节 0 〜+ ...