线程池详细解析(三)

article/2025/6/11 5:14:58

 本章我们来讲一讲线程池的最后一个方法shutdown,这个方法的主要作用就是将线程池进行关闭

shutdown:

    public void shutdown() {ReentrantLock var1 = this.mainLock;var1.lock();try {this.checkShutdownAccess();this.advanceRunState(0);this.interruptIdleWorkers();this.onShutdown();} finally {var1.unlock();}this.tryTerminate();}

可以看出线程池关闭的这个方法也是获取的全局锁进行上锁处理,我们发现在线程池中很多方法都是需要拿全局锁来进行上锁处理的:线程池关闭,执行任务。。。等方法

随后调用了四个方法

  1. 权限检查
    checkShutdownAccess():确保调用者有权限关闭线程池,通常通过安全管理器验证。

  2. 状态转换
    advanceRunState(0):将线程池状态设置为SHUTDOWN(参数 0 对应SHUTDOWN状态),禁止新任务提交,但会继续执行已提交的任务。

  3. 中断空闲线程
    interruptIdleWorkers():中断所有空闲的工作线程,使它们从等待队列中退出,加速关闭过程。

  4. 触发关闭回调
    onShutdown():空方法,可被子类重写以实现自定义关闭逻辑,例如资源释放或日志记录。

下面我们一一查看这四个方法

checkShutdownAccess:

    private void checkShutdownAccess() {SecurityManager var1 = System.getSecurityManager();if (var1 != null) {var1.checkPermission(shutdownPerm);ReentrantLock var2 = this.mainLock;var2.lock();try {Iterator var3 = this.workers.iterator();while(var3.hasNext()) {Worker var4 = (Worker)var3.next();var1.checkAccess(var4.thread);}} finally {var2.unlock();}}}

checkShutdownAccess这个方法主要是检查是否有权限关闭线程池,从系统中获取到SecurityManager 这个用于管理jvm权限的权限工具,对其进行校验是否有资格shutdown。之后再从workers队列中进行遍历worker对其进行权限检查。总的来说这个方法就是进行权限的校验检查的

advanceRunState:

    private void advanceRunState(int var1) {int var2;do {var2 = this.ctl.get();} while(!runStateAtLeast(var2, var1) && !this.ctl.compareAndSet(var2, ctlOf(var1, workerCountOf(var2))));}

这个方法的作用则是通过CAS将线程池的状态置为shutdown状态,这样后续的线程在执行完任务之后会检查线程池状态,如果shutdown状态当任务执行完毕之后则会销毁线程

interruptIdleWorkers:

    private void interruptIdleWorkers(boolean var1) {ReentrantLock var2 = this.mainLock;var2.lock();try {Iterator var3 = this.workers.iterator();while(var3.hasNext()) {Worker var4 = (Worker)var3.next();Thread var5 = var4.thread;if (!var5.isInterrupted() && var4.tryLock()) {try {var5.interrupt();} catch (SecurityException var15) {} finally {var4.unlock();}}if (var1) {break;}}} finally {var2.unlock();}}

这个方法的主要作用则是关闭掉那些空闲的线程,一样的获取全局锁然后开始遍历整个线程集合,查找那些空闲线程(即未上锁的线程),查找到之后则直接更改其中断位,后续空闲线程当查询到自己中断后则会跳出循环直接进行销毁线程,而这个方法的参数Boolean类型的作用就是用来标志是否回收一个空闲线程还是回收全部。

onShutdown

而这个方法则是空方法主要用来后置shutdown的钩子函数的,留给子类去实现。

总结:


http://www.hkcw.cn/article/IssJDxpiVN.shtml

相关文章

口碑对比:杭州白塔岭画室和燕壹画室哪个好?

从口碑方面来看,杭州燕壹画室和白塔岭画室各有特点,以下是具体分析: 燕壹画室 教学成果突出: 其前身燕壹设计工作室在2019 - 2023年专注美院校考设计,有一定的教学积淀,2023年转型后第一年攻联考就斩获浙…

车载雷达:超声波雷达、毫米波雷达、激光雷达相关技术场景介绍和技术比较

随着技术发展,如今的汽车智能化程度越来越高,配备的传感器也越来越多,特别是与辅助驾驶相关的汽车雷达,它们如同汽车的 “眼睛”,帮助车辆感知周围环境。为了适配不同的使用场景和功能需求,汽车雷达也分为很多类型,并且各具特点。 一、技术特点 一)超声波雷达 超声波…

Spring AI Advisor机制

Spring AI Advisors 是 Spring AI 框架中用于拦截和增强 AI 交互的核心组件,其设计灵感类似于 WebFilter,通过链式调用实现对请求和响应的处理5。以下是关键特性与实现细节: 核心功能 ‌1. 请求/响应拦截‌ 通过 AroundAdvisor 接口动态修…

GPTBots在AI大语言模型应用中敏感数据匿名化探索和实践

背景 随着人工智能技术的快速发展,尤其是大语言模型(LLM-large language model)在金融、医疗、客服等领域的广泛应用,处理海量数据已成为常态。然而,这些数据中往往包含个人可识别信息(PII-Personally Ide…

使用 C++/OpenCV 制作跳动的爱心动画

使用 C/OpenCV 制作跳动的爱心动画 本文将引导你如何使用 C 和 OpenCV 库创建一个简单但有趣的跳动爱心动画。我们将通过绘制参数方程定义的爱心形状,并利用正弦函数来模拟心跳的缩放效果。 目录 简介先决条件核心概念 参数方程绘制爱心动画循环模拟心跳效果 代码…

入门AJAX——XMLHttpRequest(Get)

一、什么是 AJAX AJAX Asynchronous JavaScript And XML(异步的 JavaScript 和 XML)。 1、XML与异步JS XML: 是一种比较老的前后端数据传输格式(已经几乎被 JSON 代替)。它的格式与HTML类似,通过严格的闭合自定义标…

MDP的observations部分

文章目录 1.isaaclab的observations1.1 根状态相关观测base_pos_zbase_lin_vel (use)base_ang_vel (use)projected_gravity (use)root_pos_wroot_quat_wroot_lin_vel_wroot_ang_vel_w 1.2 关节状态相关观测joint_posjoint_pos_rel…

Rhino插件大全下载指南:解锁犀牛潜能,提升设计效率

Rhinoceros(简称Rhino,犀牛)以其强大的NURBS曲面建模能力、灵活的脚本环境以及与Grasshopper参数化设计工具的无缝集成,在全球工业设计、建筑设计、珠宝设计、船舶设计等领域备受推崇。为了进一步拓展Rhino的功能,满足…

百万级临床试验数据库TrialPanorama发布!AI助力新药研发与临床评价迎来新基石

2025年5月22日,伊利诺伊大学厄巴纳-香槟分校的研究团队在《arXiv》上发表了一篇前瞻性研究论文《TrialPanorama: Database and Benchmark for Systematic Review and Design of Clinical Trials》,该研究建立了一个临床试验数据库TrialPanorama&#xff…

运维 vm 虚拟机ip设置

虚拟网络设置 nat 模式 网卡 主机设置网卡地址 虚拟机绑定网卡

问题七、isaacsim中添加IMU传感器

0 前言 NVIDIA Isaac Sim 中的 IMU 传感器可跟踪车身运动并输出模拟加速度计和陀螺仪读数。与真实 IMU 传感器一样,模拟 IMU 可通过平台单元提供局部 x、y、z 轴的加速度和角速度测量值。 1 创建IMU传感器 按照下述步骤依次点击 使用python创建 基于IsaacSensorCreateImuSe…

AutoGenTestCase - 借助AI大模型生成测试用例

想象一下,你正在为一个复杂的支付系统编写测试用例,需求文档堆积如山,边缘场景层出不穷,手动编写让你焦头烂额。现在,有了AutoGenTestCase,这个AI驱动的“测试用例生成机”可以从需求文档中自动生成数百个测…

警惕假冒 CAPTCHA 攻击通过多阶段payload链部署远控和盗窃信息

在过去几个月中,Trend Micro 托管检测与响应(MDR)调查中发现假冒 CAPTCHA 的案例激增。这些 CAPTCHA 通过钓鱼邮件、URL 重定向、恶意广告或 SEO 污染投放。所有观察到的案例均表现出类似行为:指导用户将恶意命令复制粘贴到 Windo…

2024-2025-2-《移动机器人设计与实践》-复习资料-8……

2024-2025-2-《移动机器人设计与实践》-复习资料-1-7-CSDN博客 08 移动机器人基础编程 单选题(6题) 在ROS中,用于移动机器人速度控制的消息类型通常是? A. std_msgs/StringB. geometry_msgs/TwistC. sensor_msgs/ImageD. nav_ms…

楼宇自控系统赋能设备管理智能化集中化,驱动建筑节能高效运行

在建筑行业追求可持续发展与高效运营的当下,传统建筑设备管理模式因信息分散、调控粗放等问题,导致能源浪费严重、设备维护成本高企。而楼宇自控系统凭借对建筑内各类设备的智能化、集中化管理能力,成为解决这些难题的关键。通过实时监测、智…

三、kafka消费的全流程

五、多线程安全问题 1、多线程安全的定义 使用多线程访问一个资源,这个资源始终都能表现出正确的行为。 不被运行的环境影响、多线程可以交替访问、不需要任何额外的同步和协同。 2、Java实现多线程安全生产者 这里只是模拟多线程环境下使用生产者发送消息&…

集合类基础概念

目录 集合类概述 集合框架的体系结构 单列集合(Collection) List接口 Set接口 双列集合(Map) Map接口 线程安全与性能考虑 集合与数组的区别 大小是否固定 数据类型与存储 操作方法丰富性 内存与性能 类型安全与泛型…

1500多个免费的HTML模板

1500多个免费的HTML模板 用于网站,着陆页,博客,投资组合,电子商务和管理仪表板 Free HTML Website Templates on HTMLrev https://htmlrev.com/

博客操作规范

一、博客内容规范 专有名词:深蓝粗体,一级专有名词。 专有名词:靛蓝粗体,二级专有名词。 一般名词:浅蓝粗体,一般名词。 标记名词,蓝色粗体,标记性的名词。 重点句子&#xff1…

秋招Day12 - 计算机网络 - IP

IP协议的定义和作用? IP协议用于在计算机网络中传递数据包,定义了数据包的格式和处理规则,确保数据能够从一个设备传递到另一个设备,中间可能经过多个不同的设备(路由器)。 IP协议有哪些作用?…