ThreadPoolExecutor中的keepAliveTime详解

文章目录

          • 一、keepAliveTime的概念
          • 二、keepAliveTime的设置方法
            • 2.1. 通过构造函数设置
            • 2.2. 通过setKeepAliveTime方法动态设置
          • 三、线程是如何根据keepAliveTime进行销毁的

阅读这篇文章,你将会知道:
keepAliveTime的概念。
keepAliveTime是如何设置的。
线程是如何根据keepAliveTime进行销毁的。

一、keepAliveTime的概念
  • 1 keepAliveTime的单位是纳秒,即1s=1000000000ns,1秒等于10亿纳秒。
  • 2 keepAliveTime是线程池中空闲线程等待工作的超时时间。
  • 3 当线程池中线程数量大于corePoolSize(核心线程数量)或设置了allowCoreThreadTimeOut(是否允许空闲核心线程超时)时,线程会根据- 1 keepAliveTime的值进行活性检查,一旦超时便销毁线程。
  • 4 否则,线程会永远等待新的工作。
    /*** Timeout in nanoseconds for idle threads waiting for work.* Threads use this timeout when there are more than corePoolSize* present or if allowCoreThreadTimeOut. Otherwise they wait* forever for new work.*/private volatile long keepAliveTime;
二、keepAliveTime的设置方法
2.1. 通过构造函数设置

通过 keepAliveTime 、unit共同决定实际的 keepAliveTime值,最终会转化成纳秒单位。
在这里插入图片描述

2.2. 通过setKeepAliveTime方法动态设置

重新设置线程池的keepAliveTime属性,如果发现将要设置的值比原来的keepAliveTime值要小(即减小keepAliveTime),则触发interruptIdleWorkers(),中断空闲线程。
在这里插入图片描述
interruptIdleWorkers()是怎么中断线程的呢?
(1)interruptIdleWorkers先拿出所有的工作者进行遍历,判断工作者对应的线程是否已经中断。
(2)如果没有产生中断,则判断是否可以获得锁,如果能获得锁,则代表是空闲线程,然后中断该线程。
(3)至于线程的中断在什么时候会抛出中断异常,同学们可以自己找下资料,也可以参考下别人写的这篇文章Java并发之线程中断
在这里插入图片描述

三、线程是如何根据keepAliveTime进行销毁的
  • 1.线程池中的线程通过工作者(Worker)这个类进行包装,Worker通过 ThreadPoolExecutor.runWorker() 这个方法进行自旋,从队列中获得task,并完成工作。

  • 2.如果拿不到task(即firstTask == null 或 getTask() == null),则会退出自旋,进入finally代码块。finally中会调用processWorkerExit方法,注销当前Worker,实现worker的销毁。对keepAliveTime的使用,就在getTask()方法中,这个在后面讲解。
    在这里插入图片描述

  • 3.getTask 怎么使用 keepAliveTime
    (1)首先也是一个自旋,当allowCoreThreadTimeout(运行空闲核心线程超时) 或 wc>corePoolSize(当前线程数量大于核心线程数量) 时,timed会标识为true,表示需要进行超时判断。
    (2)当wc(当前工作者数量)大于 最大线程数 或 空闲线程的空闲时间大于keepAliveTime(timed && timeout),以及wc>1或(workQueue)任务队列为空时,会进入compareAndDecrementWorkerCount方法,对wc的值减1。
    (3)当compareAndDecrementWorkerCount方法返回true时,则getTask方法会返回null,终止getTask方法的自旋。这时候回到runWorker方法,就会进入到processWorkerExit方法,进行销毁worker。
    在这里插入图片描述

  • 4.compareAndDecrementWorkerCount中操作的是ctl属性:
    (1)ctl是中心控制器,一个AtomicInteger类型的整数,通过数字的二进制编码的位进行分段,不同的二进制位段表示有不同的含义。
    (2)在ctl中,低29为表示线程池的容量,即线程池最大容量为 536870911 = 000 11111111111111111111111111111。
    在这里插入图片描述

	/*** The main pool control state, ctl, is an atomic integer packing* two conceptual fields*   workerCount, indicating the effective number of threads*   runState,    indicating whether running, shutting down etc*/private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));// COUNT_BITS = 29private static final int COUNT_BITS = Integer.SIZE - 3;// CAPACITY = 536870911 = 000 11111111111111111111111111111private static final int CAPACITY   = (1 << COUNT_BITS) - 1;private static int workerCountOf(int c)  { return c & CAPACITY; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5 扩展属性,HTML5属性的介绍和扩展.doc

HTML5属性的介绍和扩展HTML5视频HTML5 规定了一种通过 video 元素来包含视频的标准方法。如需在 HTML5 中显示视频&#xff0c;您所有需要的是&#xff1a;音频Canvas一 简单图形整套的属性和方法专门用于绘制矩形&#xff1a;1、fillStyle可以设置为CSS颜色、一个图案或一种颜…

OPPO数据中台之基石:基于Flink SQL构建实数据仓库

本文整理自 2019 年 4 月 13 日在深圳举行的 Flink Meetup 会议&#xff0c;分享嘉宾张俊&#xff0c;目前担任 OPPO 大数据平台研发负责人&#xff0c;也是 Apache Flink contributor。本文主要内容如下&#xff1a; OPPO 实时数仓的演进思路&#xff1b;基于 Flink SQL 的扩…

如何实现7*24小时灵活发布?阿里技术团队这么做

研发效能分为两块&#xff0c;一是用技术的更新来提升效率&#xff1b;二是提高整个技术生态中的协同效率&#xff0c;激发技术活力。阿里巴巴技术团队在此基础上要实现的终极目标是打造7*24小时灵活发布的通道&#xff0c;以及提供更快的业务代码迭代能力。今天&#xff0c;阿…

quarz cron表达式在线配置和运行看效果

https://www.bejson.com/othertools/cronvalidate/

不看就亏系列!这里有完整的 Hadoop 集群搭建教程,和最易懂的 Hadoop 概念!| 附代码...

作者 | chen_01_c责编 | Carol来源 | CSDN 博客封图 | CSDN付费下载于视觉中国hadoop介绍Hadoop 是 Lucene 创始人 Doug Cutting&#xff0c;根据 Google 的相关内容山寨出来的分布式文件系统和对海量数据进行分析计算的基础框架系统&#xff0c;其中包含 MapReduce 程序&#…

数据科学家是个性感的工作?我信你个鬼!

数据科学家40%是个吸尘器&#xff0c;40%是个清洁工&#xff0c;剩下20%是个算命的。作者 | Jingles译者 | 香槟超新星&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;根据《哈佛商业评论》的说法&#xff0c;数据科学家是21世纪最性感的工作。在现在这…

深入搜索引擎原理

之前几段工作经历都与搜索有关&#xff0c;现在也有业务在用搜索&#xff0c;对搜索引擎做一个原理性的分享&#xff0c;包括搜索的一系列核心数据结构和算法&#xff0c;尽量覆盖搜索引擎的核心原理&#xff0c;但不涉及数据挖掘、NLP等。文章有点长&#xff0c;多多指点~~ 一…

String转int,int转String

/*** string 转换int** param strInt* return*/public int intConverStr(String strInt) {try {return Integer.parseInt(strInt);} catch (NumberFormatException e) {logger.error("string conver int failure", e);}return 0;}/*** int 转换 string** param i* re…

印度版的“大众点评”如何将 Food Feed 业务从 Redis 迁移到 Cassandra

Zomato 是一家食品订购、外卖及餐馆发现平台&#xff0c;被称为印度版的“大众点评”。目前&#xff0c;该公司的业务覆盖全球24个国家&#xff08;主要是印度&#xff0c;东南亚和中东市场&#xff09;。本文将介绍该公司的 Food Feed 业务是如何从 Redis 迁移到 Cassandra 的…

如何使用计算机上合并计算方法,excel如何使用合并计算

Excel使用合并计算的方法是&#xff1a;1、首先打开“数据”选项卡&#xff0c;单击“合并计算”按钮。2、打开“合并计算”对话框&#xff0c;在“函数”下拉列表中选择“求和”选项&#xff0c;然后单击“引用位置”文本框右侧的范围按钮。3、此时进入“合并计算-引用位置”状…

利用Packer自定义镜像创建容器集群

阿里云容器服务Kubernetes集群支持CentOS操作系统&#xff0c;在绝大多数情况下可以满足客户的要求。但是有些客户由于业务系统对操作系统依赖比较高&#xff0c;希望定制化一些操作系统参数&#xff0c;则可以用自定义镜像来创建Kubernetes集群。 创建自定义操作系统镜像有两…

“远程”、“协作”风靡之际,你对TA知晓多少?

作者|晶少 转载|CSDN博客 2.4亿人在线使用文档协作无延宕…… 6万名武汉中小学生实力打造“远程课堂”活学高效…… 疫情以来&#xff0c;“远程”、“协作”持续大热&#xff0c;此局毋庸置疑。 根据QuestMobile最新发布的《2020中国移动互联网“战役”专题报告》显示&am…

java 判断对象是否为空

public static void main(String[] args) {Hxprocesslog hxlog null;if (StringUtils.isEmpty(hxlog)) {logger.info("null");} else {logger.info("not null");}} 控制台输出: 2021-01-17 16:26:43,032:INFO main (DataConvertShell.java:351) - null

蚂蚁金服OceanBase性价比是传统数据库的十倍

200名数据库领域从业三年以上的会员投票和专业的评委评选&#xff0c;在如此严苛的条件之下&#xff0c;蚂蚁金服金融级分布式关系数据库OceanBase 2.0依然获得了专家评审团的一致青睐&#xff0c;荣获2019中国数据库技术大会的“年度最佳创新产品”奖。 蚂蚁金服资深总监韩鸿源…

微型计算机原理及其应用彭楚武答案第三章,微机原理及其应用_第1章.ppt

微机原理及其应用_第1章微机原理及其应用_第1章本课程的考核方式&#xff1a; 开卷考试 评分标准&#xff1a; 期末考试成绩占70 %、 实验成绩占10 %、 课堂考核及作业占20% 。 全院各专业统一命题、流水作业阅卷、统一评分 如何学好“微机原理与接口技术”&#xff1f; 关键在…

战疫内外,京东智联云如此“一鸣惊人”!

作者|晶少 转载|CSDN博客 鼠年春节&#xff0c;一场疫情突如其来地打破了人们平静的生活&#xff1b;但在滨州&#xff0c;一款名为“疫情助手”的上线软件却为滨州市民的疫情生活带来“雪中送炭”的丝丝温情&#xff0c;细微知著中人们深深感受到了京东诠释而来的“ABCDE”技…

亿级消息系统的核心存储:Tablestore发布Timeline 2.0模型

背景 互联网快速发展的今天&#xff0c;社交类应用、消息类功能大行其道&#xff0c;占据了大量网络流量。大至钉钉、微信、微博、知乎&#xff0c;小至各类App的推送通知&#xff0c;消息类功能几乎成为所有应用的标配。根据场景特点&#xff0c;我们可以将消息类场景归纳成三…

2个 string 日期比较

public static void main(String[] args) {String date1 "2019-02-12";String date2 "2019-01-21";int compareTo date1.compareTo(date2);if (compareTo > 0) {System.out.println("date1 大于 date2");} else if (compareTo 0) {System…

SLS机器学习最佳实战:日志聚类+异常告警

0.文章系列链接 SLS机器学习介绍&#xff08;01&#xff09;&#xff1a;时序统计建模SLS机器学习介绍&#xff08;02&#xff09;&#xff1a;时序聚类建模SLS机器学习介绍&#xff08;03&#xff09;&#xff1a;时序异常检测建模SLS机器学习介绍&#xff08;04&#xff09;…

计算机网络的ip分配,IP地址分配_网络设备技术应用_太平洋电脑网PConline

2.2 IP地址分配IPv4地址分配初期采用基于类别的方式&#xff0c;有3类主要方式&#xff1a;A、B和C以及2种特殊的网络地址D和E。*类型A地址&#xff1a;其中前7bit用于网络标识&#xff0c;后24bit用于主机标识&#xff0c;A类地址可容纳128个网络&#xff0c;任意A类网络中可…