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. 线程池中的七大参数(三)

    线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...

  2. [.Net线程处理系列]专题二:线程池中的工作者线程

    目录: 一.上节补充 二.CLR线程池基础 三.通过线程池的工作者线程实现异步 四.使用委托实现异步 五.任务 六.小结 一.上节补充 对于Thread类还有几个常用方法需要说明的. 1.1 Susp ...

  3. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

    文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...

  4. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  5. [C#]获得线程池中活动的线程数

    在C#中的线程池ThreadPool没有获得线程池中的活动线程数量的属性或者是方法,但是有一两个 方法可以帮助获得活动线程数. 这两个方法分别是:GetMaxThreads和GetAvailableT ...

  6. 从源码角度解析线程池中顶层接口和抽象类

    摘要:我们就来看看线程池中那些非常重要的接口和抽象类,深度分析下线程池中是如何将抽象这一思想运用的淋漓尽致的. 本文分享自华为云社区<[高并发]深度解析线程池中那些重要的顶层接口和抽象类> ...

  7. 为什么用线程池?解释下线程池参数?线程池处理流程?阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理?

    为什么用线程池?解释下线程池参数? 1.降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗. 2.提高响应速度:任务来了,直接有线程可用可执行,而不是先创建线程,再执行. 3.提高线程的可管理性: ...

  8. java线程池newfi_Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...

  9. Java 确定线程池中工作线程数的大小

    以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...

最新文章

  1. DVWA安装——一个菜鸟的入门教程
  2. 基于 CentOS Mysql 安装与主从同步配置详解
  3. 火狐查cookie_Firefox 65默认会阻止跟踪Cookie
  4. 计算机网络中对等层,【计算机网络】两个网络模型——OSI参考模型和TCP/IP模型...
  5. 【Codeforces - 798C】 Mike and gcd problem(思维,贪心)
  6. Ubuntu安装Google浏览器
  7. 延迟任务调度系统—技术选型与设计(上篇)
  8. Ajax+Java实现大文件切割上传
  9. LeetCode算法题-Delete Node in a Linked List(Java实现)
  10. cc=arm-linux,针对基于嵌入式ARM的Linux系统的交叉编译
  11. 计算几何模板(kuangbin)
  12. cad快捷栏怎么调出来_如何显示CAD的工具栏?CAD如何调出工具栏
  13. php 评论插件,typecho插件:TeComment评论增强插件
  14. 【​观察】加速“云矩阵”生态落地,京东云能否成为新变量?
  15. 纳德拉:Windows Phone市场份额虽低 但它“完整了体验”
  16. 你在找mp3音频格式转换器有哪些吗?分享3个实用的软件
  17. ROSERROR : The root link_base has an inertia specified in the URDF, but KDL does not support ...
  18. java file 的length_java里怎么知道一个file的大小?
  19. JAVA Swing主题 简洁扁平化苹果风格主题
  20. 一个如何在bash中使用getopts的例子

热门文章

  1. codeforces 667A A. Pouring Rain(水题)
  2. 在应用了皮肤的程序中制作透明的文本编辑控件(如:TcxMemo)
  3. Session与Cookie区别[1][摘]
  4. Mcad学习笔记之序列化(2进制和Soap序列化)
  5. python手机版做小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏...
  6. python怎么用excel-用Python控制Excel实现自动化办公,手把手教你
  7. 基于python的界面自动化测试-基于Selenium+Python的web自动化测试框架
  8. 0基础学python-看完这篇,零基础也知道怎么学Python
  9. python语言能干什么-python语言能做什么
  10. 零基础python书籍推荐-非IT行业,零基础自学Python,选什么书?