ThreadPoolExecutor参数详解
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参数详解的更多相关文章
- 【并发编程】ThreadPoolExecutor参数详解
ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long ke ...
- Nginx主配置参数详解,Nginx配置网站
1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...
- iptables参数详解
iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...
- chattr的常用参数详解
chattr的常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际生产环境中,有的运维工程师不得不和开发和测试打交道,在我们公司最常见的就是部署接口.每天每个人部署的 ...
- mha配置参数详解
mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...
- $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解
[一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...
- linux PHP 编译安装参数详解
linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- 【转】jqGrid 各种参数 详解
[原文]http://www.cnblogs.com/younggun/archive/2012/08/27/2657922.htmljqGrid 各种参数 详解 JQGrid JQGrid是一个 ...
- HTML滚动字幕代码参数详解及Js间隔滚动代码
html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...
随机推荐
- CDN 加速配置
1 https://cloud.tencent.com/document/product/228/3149 2 https://cloud.tencent.com/document/product/4 ...
- spring中注解@Resource 与@Autowire 区别
① .@Resource 是根据名字进行自动装配:@Autowire是通过类型进行装配. ②. @Resource 注解是 jdk 的:@Autowire 是spring的.
- Docker安装教程(超详细)
Docker安装教程(超详细) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 http:// ...
- HDU - 2091 空心三角形 水题,但是有点坑...
空心三角形 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- C++入门教程之一:Hello world
C++入门教程之一:Hello world C++是各位程序员跳不过的一个坑,也是各位想学编程的人必备的知识,更是各大比赛(如NOI)的官方指定语言. 在TIOBE(一个编程语言社区排行榜)中,截止2 ...
- 033.Python的__del__析构方法he__call__方法
一 __del__ 魔术方法(析构方法) 1.1 介绍 触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候] 功能:对象使用完毕后资源回收 参数:一个s ...
- ELK学习实验016:filebeat收集tomcat日志
filebeat收集tomcat日志 1 安装tomcat [root@node4 ~]# yum -y install tomcat tomcat-webapps tomcat-admin-weba ...
- Java 线程池 ThreadPoolExecutor 的使用
引言 JAVA 语言为我们提供了两种基础线程池的选择: ThreadPoolExecutor ScheduledThreadPoolExecutor 它们都实现了 ExecutorService 接口 ...
- 8.12-14 df 、mkswap、swapon、swapoff、sync
8.12 df:报告文件系统磁盘空间的使用情况 -a 显示所有文件系统 -h 以容易理解的格式显示磁盘的使用情况端 -i 显示文件系统的inode信息迷 -t 显示指定类型 ...
- 如何在idea中将项目生成API文档(超详细)(Day_32)
1.打开要生成API文档的项目,点击菜单栏中的Tools工具,选择Generate JavaDoc 2.打开如下所示的Specify Generate JavaDoc Scope 界面 3.解释下Ot ...