当前位置: 首页 > news >正文

线程池详细解析(三)

 本章我们来讲一讲线程池的最后一个方法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.xdnf.cn/news/784225.html

相关文章:

  • 报表/报告组件(二)-实例与实现解释
  • pytorch3d+pytorch1.10+MinkowskiEngine安装
  • CSS基础2
  • saveOrUpdate 有个缺点,不会把值赋值为null,解决办法
  • Monorepo 详解:现代前端工程的架构革命
  • Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析
  • Electron 桌面商城开发:攻克多窗口通信、本地存储与内存泄漏实战
  • Linux——初步认识Shell、深刻理解Linux权限
  • 【Redis】笔记|第7节|大厂生产级Redis高并发分布式锁实战(二)
  • 二进制安全-OpenWrt-uBus
  • Ethernet/IP转DeviceNet网关:驱动大型矿山自动化升级的核心纽带
  • Freemarker快速入门
  • Linux 测试本机与192.168.1.130 主机161/udp端口连通性
  • 【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)
  • 【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程
  • 悟饭游戏厅苹果版(悟饭掌悦)|iOS游戏社区手柄工具
  • HCIP(BGP综合实验)
  • window 显示驱动开发-DirectX 视频加速 2.0
  • 15个基于场景的 DevOps 面试问题及答案
  • P2656 采蘑菇
  • Linux总结
  • Redis看门狗机制
  • Halcon光度立体法
  • 相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解
  • 矩阵的偏导数
  • 点击启动「高效模式」:大腾智能 CAD 重构研发设计生产力
  • 『React』组件副作用,useEffect讲解
  • KEYSIGHT是德科技 E5063A 18G ENA系列网络分析仪
  • 【python与生活】用 Python 从视频中提取音轨:一个实用脚本的开发与应用
  • 6.RV1126-OPENCV 形态学基础膨胀及腐蚀