线程池中keepAliveTime的理解
1、概述
keepAliveTime是多余的线程等待新任务的最长时间,超过这个时间多余的线程将被终止。
2、runWorker
工作线程主要是执行runWorker。如果从工作队列中获取的task为空,则线程终止。
final void runWorker(Worker w) {Thread wt = Thread.currentThread();Runnable task = w.firstTask;w.firstTask = null;w.unlock(); // allow interruptsboolean completedAbruptly = true;try {while (task != null || (task = getTask()) != null) {w.lock();// If pool is stopping, ensure thread is interrupted;// if not, ensure thread is not interrupted. This// requires a recheck in second case to deal with// shutdownNow race while clearing interruptif ((runStateAtLeast(ctl.get(), STOP) ||(Thread.interrupted() &&runStateAtLeast(ctl.get(), STOP))) &&!wt.isInterrupted())wt.interrupt();try {beforeExecute(wt, task);Throwable thrown = null;try {task.run();} catch (RuntimeException x) {thrown = x; throw x;} catch (Error x) {thrown = x; throw x;} catch (Throwable x) {thrown = x; throw new Error(x);} finally {afterExecute(task, thrown);}} finally {task = null;w.completedTasks++;w.unlock();}}completedAbruptly = false;} finally {processWorkerExit(w, completedAbruptly);}}
3、getTask
当从工作队列中获取新任务超时时,会将标志timeout设置为true。在进入下一次循环中,有以下几种情况会返回任务为null。
- 在工作线程数大于maximumPoolSize并且最大线程数大于1时,在什么情况下会出现这种情况呢?在调用线程池的setMaximumPoolSize时。
- 工作线程数在核心线程数与最大线程数之间,超时标志timeout为true,工作线程数大于1或者工作队列为空
- 设置了允许核心线程超时标志(allowCoreThreadTimeout),超时标志timeout为true,并且工作线程数大于1或者工作队列为空
在满足上面三种情况时,在cas设置工作线程数成功情况下,getTask返回null。
线程池中keepAliveTime的理解相关推荐
- 线程池中的七大参数(三)
线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...
- [.Net线程处理系列]专题二:线程池中的工作者线程
目录: 一.上节补充 二.CLR线程池基础 三.通过线程池的工作者线程实现异步 四.使用委托实现异步 五.任务 六.小结 一.上节补充 对于Thread类还有几个常用方法需要说明的. 1.1 Susp ...
- 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...
- Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...
- [C#]获得线程池中活动的线程数
在C#中的线程池ThreadPool没有获得线程池中的活动线程数量的属性或者是方法,但是有一两个 方法可以帮助获得活动线程数. 这两个方法分别是:GetMaxThreads和GetAvailableT ...
- 从源码角度解析线程池中顶层接口和抽象类
摘要:我们就来看看线程池中那些非常重要的接口和抽象类,深度分析下线程池中是如何将抽象这一思想运用的淋漓尽致的. 本文分享自华为云社区<[高并发]深度解析线程池中那些重要的顶层接口和抽象类> ...
- 为什么用线程池?解释下线程池参数?线程池处理流程?阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理?
为什么用线程池?解释下线程池参数? 1.降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗. 2.提高响应速度:任务来了,直接有线程可用可执行,而不是先创建线程,再执行. 3.提高线程的可管理性: ...
- java线程池newfi_Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...
- Java 确定线程池中工作线程数的大小
以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...
最新文章
- DVWA安装——一个菜鸟的入门教程
- 基于 CentOS Mysql 安装与主从同步配置详解
- 火狐查cookie_Firefox 65默认会阻止跟踪Cookie
- 计算机网络中对等层,【计算机网络】两个网络模型——OSI参考模型和TCP/IP模型...
- 【Codeforces - 798C】 Mike and gcd problem(思维,贪心)
- Ubuntu安装Google浏览器
- 延迟任务调度系统—技术选型与设计(上篇)
- Ajax+Java实现大文件切割上传
- LeetCode算法题-Delete Node in a Linked List(Java实现)
- cc=arm-linux,针对基于嵌入式ARM的Linux系统的交叉编译
- 计算几何模板(kuangbin)
- cad快捷栏怎么调出来_如何显示CAD的工具栏?CAD如何调出工具栏
- php 评论插件,typecho插件:TeComment评论增强插件
- 【​观察】加速“云矩阵”生态落地,京东云能否成为新变量?
- 纳德拉:Windows Phone市场份额虽低 但它“完整了体验”
- 你在找mp3音频格式转换器有哪些吗?分享3个实用的软件
- ROSERROR : The root link_base has an inertia specified in the URDF, but KDL does not support ...
- java file 的length_java里怎么知道一个file的大小?
- JAVA Swing主题 简洁扁平化苹果风格主题
- 一个如何在bash中使用getopts的例子
热门文章
- codeforces 667A A. Pouring Rain(水题)
- 在应用了皮肤的程序中制作透明的文本编辑控件(如:TcxMemo)
- Session与Cookie区别[1][摘]
- Mcad学习笔记之序列化(2进制和Soap序列化)
- python手机版做小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏...
- python怎么用excel-用Python控制Excel实现自动化办公,手把手教你
- 基于python的界面自动化测试-基于Selenium+Python的web自动化测试框架
- 0基础学python-看完这篇,零基础也知道怎么学Python
- python语言能干什么-python语言能做什么
- 零基础python书籍推荐-非IT行业,零基础自学Python,选什么书?