线程池-2:runWorker分析-1

news2024/11/28 22:44:48

为何runWorker中在task被当前worker中的当前线程获取到准备执行task时需要进行worker.lock()?

如下图:

1、某个worker中的run逻辑只会被worker中包装的线程进行执行;

2、按理说:不会存在多个线程并发执行同一个worker中的runWorker()逻辑,那么为什么需要在当前线程已经获取到task后进行w.lock()操作呢?

其实原因是:当前worker如果正在执行某个task任务逻辑,那么worker其实是属于被上锁(就是当前worker锁)的阶段。那么外部线程-比如main线程,想要进行线程池shutdown操作,操作worker时就可以提供针对worker同步的能力:

如上可以知道:worker中线程正在处理任务时,shutdown()逻辑中获取worker锁会失败,那么无法进行线程中断;

线程池 executor.shutdown() 跟 executor.shutdownNow()的区别

在 Java 中,executor.shutdown()executor.shutdownNow() 都是用来关闭线程池的方法,但它们之间有一些区别:

  1. executor.shutdown(): 调用该方法后,线程池将不再接受新的任务提交,但会等待已经提交的任务执行完成(包括等待队列中的任务)。线程池会逐渐关闭,直到所有任务都执行完毕,最终线程池被关闭。

  2. executor.shutdownNow(): 调用该方法后,线程池会尝试立即关闭,它会尝试中断正在执行的任务,并清空任务队列,未执行的任务会被移除。这可能会导致一些任务无法执行完成。

总的来说,executor.shutdown() 是一个温和的关闭线程池的方式,它会等待任务执行完成;而 executor.shutdownNow() 则是一种强制关闭线程池的方式,它会尝试立即关闭线程池,可能会导致部分任务无法执行完成。

在选择使用哪种方法时,根据实际情况考虑是否需要等待任务执行完成以及是否允许部分任务被丢弃。

executor.shutdownNow() 会立刻将线程池中的线程停止么?比如线程-1正在处理某个任务逻辑中

executor.shutdownNow() 方法会尝试立即关闭线程池,包括中断正在执行的任务和清空任务队列。但是需要注意的是,对于正在执行的任务,线程池会尝试中断它们,但并不能保证一定能够立即停止执行。具体来说:

  • 如果任务是可中断的(即任务内部响应中断),那么 shutdownNow() 会发送中断信号给任务,任务有可能会被中断,停止执行。

  • 如果任务不是可中断的,那么 shutdownNow() 只能等待任务执行完成。这种情况下,即使调用了 shutdownNow() 方法,任务仍然会继续执行直到完成。

因此,shutdownNow() 方法并不能保证立即停止线程池中所有线程的执行,特别是对于不可中断的任务。它会尽最大努力去停止线程的执行,但无法完全保证。

1、中断所有worker中的线程;

2、从队列中排出所有等待中的任务;

worker中的线程什么时候会执行完?

关键点在getTask()什么时候返回null?

在给定的代码中,getTask() 方法是用来获取任务的。在这个方法中,根据一系列条件判断,可能会返回 null。下面是可能导致返回 null 的情况:

1、如果线程池的运行状态 rs 大于等于 SHUTDOWN 并且队列为空,或者 rs 大于等于 STOP 并且队列为空,这表示线程池已经处于关闭状态并且队列为空,那么会递减工作线程计数并返回 null

if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
    decrementWorkerCount();
    return null;
}

2、如果工作线程数 wc 大于最大线程数 maximumPoolSize 或者允许核心线程超时(allowCoreThreadTimeOut 为 true)且 timedOut 为 true,并且(工作线程数大于1 或者 队列为空),那么会尝试递减工作线程计数并返回 null

if ((wc > maximumPoolSize || (timed && timedOut))
    && (wc > 1 || workQueue.isEmpty())) {
    if (compareAndDecrementWorkerCount(c))
        return null;
    continue;
}

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

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

相关文章

蓝桥杯真题Day41 倒计时13天 纯练题,该开始复习知识点了!

蓝桥杯第十二届省赛真题-分果果 题目描述 小蓝要在自己的生日宴会上将 n 包糖果分给 m 个小朋友。每包糖果都要分出去,每个小朋友至少要分一包,也可以分多包。 小蓝将糖果从 1 到 n 编号,第 i 包糖果重 wi。小朋友从 1 到 m 编号。每个小朋…

Codeforces Round 838 (Div. 2) D. GCD Queries

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

SpringCloud下的微服务应用技术(结尾篇)

六. Feign远程调用 6.1 替代RestTemplate RestTemplate调用问题&#xff1a;代码可读性差&#xff0c;参数复杂且URL难维护。 Feign是一个声明式的HTTP客户端&#xff0c;官方地址&#xff1a;GitHub - OpenFeign/feign: Feign makes writing java http clients easier 它可…

安装DPDK环境

安装DPDK环境 下载解压源码 wget https://fast.dpdk.org/rel/dpdk-19.08.2.tar.xz tar -xcf ./dpdk-19.08.2.tar.xz安装源码 1.处理库文件 编译库文件 ./dpdk-setup.sh 根据操作系统选择对应gcc库文件2.设置环境变量 配置多网卡队列和巨页 ethernet1.virtualDev "vm…

车载以太网AVB交换机 TSN交换机 时间敏感网络 11口 千兆 SW2000TSN

目录 一、TSN时间敏感交换机概述 二、产品介绍 SW2000M/H TSN 1、产品框架 2、产品特点与参数 产品特点 产品参数 3、配置与使用 4、常用连接方式 4.1 双通道作为监控和数据采集器&#xff0c;采集两个设备间的通信数据&#xff08;Bypass功能&#xff09; 4.2 试验搭…

如何用Python脚本自动发送邮件?

目录 1. 基础知识 1.1. SSH&#xff08;Secure Shell&#xff09;协议 1.2. SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;协议 1.3. SSH协议与SMTP协议之间的关系 2. QQ邮箱设置 2.1. 开启SMTP服务 2.2. 编写脚本 3. 测试成功 1. 基础知识 邮件的发送过…

XXE漏洞知识及ctfshow例题

XXE漏洞相关知识 XXE全称为XML Enternal Entity Injection 中文叫xml外部实体注入 什么是xml 简单了解XML&#xff1a; &#xff08;xml和html的区别可以简易的理解成&#xff1a;xml是用来储存数据和传输数据的而html是用来将数据展现出来&#xff09; XML 指可扩展标记语…

UE中:200W个对象单场景实现(待更新)

实现背景&#xff1a;需要显示城市级的行人以及地理市级范围内的路灯的状态&#xff0c;行人需要有状态以及位置的更新&#xff0c;路灯只需要状态的更新&#xff0c;二者都不需要物理 方案1概述&#xff1a;Niagara粒子系统实现 实际效果展示 UE5 集群模拟&#xff08;20W&a…

pmp培训机构哪个比较好?国内10大热门PMP培训机构是哪些?

热门PMP培训机构推荐&#xff0c;PMP备考选择威班就是选择了高通过率 PMP热门培训机构方面我还是比较推荐威班的&#xff0c;当时选择的时候有人推荐我&#xff0c;也了解了很多&#xff0c;各种科普各种对比选择&#xff0c;最后还是选择了威班。经过体验他们的通过率比较靠谱…

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop,新建或打开工程

离线linux服务器安装mysql8

本文的服务器环境&#xff1a;openEuler毛坯版的&#xff0c;很多常用的指令都没有预装&#xff0c;比如rpm、tar等等&#xff0c;没有网络坏境&#xff0c;需要自己手动配置本地yum仓库&#xff0c;安装相关指令 1、检查服务器是否已经安装了MySQL 1.1、查询mysql以安装的相关…

imx6ull移植rtthread操作系统

内存映射移植 1.进入&#xff1a;E:\rtthread\rt-smart-20201125\rt-smart\kernel\bsp\imx6ull 2.打开menuconfig&#xff0c;修改PV_OFFSET 1.进入&#xff1a;E:\rtthread\rt-smart-20201125\rt-smart\kernel\bsp\imx6ull\drivers 2.进入board.c&#xff0c;修改即…

番外篇——Idea安装通义灵码插件

最近公司领导心血来潮要求我们这些编外开发人员也要做到与时俱进。听了这话同事们纷纷起哄道&#xff1a;“什么叫与时俱进&#xff1f;怎么个做法呢&#xff1f;”领导洋洋得意地说道&#xff1a;“现在市场啥最火&#xff1f;不就是大模型嘛&#xff01;你们都在自己的开发工…

springboot共享单车系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享单车管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了共享单车管理系统&#xff0c;它彻底改变了过…

项目管理—项目合同签订后客户又不认了

大家好&#xff0c;我是不会魔法的兔子&#xff0c;是一名执业律师&#xff0c;创建[项目管理者的法小院儿]&#xff0c;持续从法律的角度分享项目管理中的风险及预防问题&#xff0c;让项目管理者能够提早发现与解决项目执行过程中的风险&#xff0c;同时欢迎大家一起交流&…

FreeRTOS day1

1.总结keil5下载代码和编译代码需要注意的事项 需要与板子连通 配置完成后才点击下载 2.总结STM32Cubemx的使用方法和需要注意的事项 下载支持包 打开芯片配置界面 3.总结STM32Cubemx配置GPIO的方法

【笔记】通过码云Gitee获取OpenHarmony源码

Note&#xff1a;下面包含操作过程和问题解决&#xff08;首次安装Ubuntu&#xff0c;环境未完善&#xff09;&#xff0c;没有遇到问题可以直接跳过问题part了&#xff0c;小白也能完成配置下载。 前置准备&#xff08;Git环境账号&#xff09; &#xff08;一&#xff09;安…

基于GA遗传优化的离散交通网络双层规划模型设计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的离散交通网络双层规划模型设计.优化输出路段1和路段2的收费情况收敛过程。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序…

企微获客助手到底有哪些价值?

获客助手作为企业微信官方提供的获客工具&#xff0c;在私域布局中确实展现了其强大的引流效率和便利性。这一工具通过简化传统引流过程中的复杂步骤&#xff0c;使得企业能够更高效地吸引和转化潜在客户。此外&#xff0c;获客助手还能实现不同渠道的无缝链接&#xff0c;进一…

OSPF之单区域配置

文章目录 单区域配置项目背景项目分析拓扑图配置思路基础配置命令查看路由器接口IP地址信息OSPF配置 测试PC1与PC2互通查看OSPF邻居表修改OSPF路由器的router-id完美的OSPF配置命令写法常用查询命令 单区域配置 项目背景 企业内部存在多个部门&#xff0c;分别属于不同的网段…