Java线程的interrupt中断、wait-notify/all(源码级分析)
实例方法:
interrupt()方法是设置结束阻塞(sleep、),并且设置中断标记true
isInterrupted()判断当前是否中断
静态方法:
Thread.interrupted():调用这个方法的线程中断标记位还原为false
那么好,既然上面的方法作用是清晰的,尝试启动个线程进行操作:
一.疑惑1,为什么如下代码调用后会出现false
@Slf4j
public class InterruptTest {public static void main(String[] args) {Thread t1 = new Thread(() -> {try {Thread.currentThread().sleep(5000);} catch (InterruptedException e) {log.info("中断状态1:{}", Thread.currentThread().isInterrupted());}});t1.start();try {Thread.sleep(2000); // 等待2秒,确保主线程调用t1线程interrupt时t1是启动好的} catch (InterruptedException e) {e.printStackTrace();}t1.interrupt();}
}
输出结果: InterruptTest - 中断状态1:false
不是说线程实例方法interrupt()调用后会设置中断标记嘛,为什么是false
解答:当 InterruptedException 被抛出时,JVM 会自动清除当前线程的中断标志。
它清除中断标志是为了避免开发者不小心忽略异常后,线程还带着一个“脏标志”继续运行,导致逻辑混乱,真是贴心的很。
一.疑惑2,既然JVM自动清理标记,再调用interrupt()总可以看到true了吧
public static void main(String[] args) {Thread t1 = new Thread(() -> {try {Thread.currentThread().sleep(5000);} catch (InterruptedException e) {log.info("中断状态1:{}", Thread.currentThread().isInterrupted());Thread.currentThread().interrupt();log.info("中断状态2:{}", Thread.currentThread().isInterrupted());Thread.interrupted();log.info("中断状态3:{}", Thread.currentThread().isInterrupted());}});t1.start();try {Thread.sleep(2000); // 等待2秒,确保主线程调用t1线程interrupt时t1是启动好的} catch (InterruptedException e) {e.printStackTrace();}t1.interrupt();}
运行结果:果然出现了true
thread.InterruptTest2 - 中断状态1:false
thread.InterruptTest2 - 中断状态2:true
thread.InterruptTest2 - 中断状态3:false
thread.cpp下的interrupt函数:(807行是调用操作系统的逻辑)

继续跟进到os_linux.cpp,也可以分系统选看,我直接选Linux的了


如果线程不是阻塞状态(例如未在 sleep()、park() 或 wait() 等阻塞点),这段代码的效果仅仅是改了中断标志位,其他操作(如 unpark() 唤醒线程)不会有实际作用,也不会耽误线程继续运行。
thread.cpp的is_interrupted函数:

同样溯源到os_linux.cpp

一.疑惑3,wait、notify-all为什么都要加同一个synchronized
阅读Object相关源码:objectMonitor.cpp
wait函数:

尾插法放入队列:

_WaitSetLock 是一个自旋锁,用于保护 WaitSet 的并发访问,在objectMonitor.hpp中

也就是WAIT/TIME WAIT本质上是用一个Object中的等待队列去存储需要等待的线程对象,每一个Object对象都可以充当这个角色,获取这个对象的waitset才能把Thread放入,唤醒相当于再从这个waitset中把线程剔除来再唤醒,这也就是为什么wait notify/all 方法需要synchronized同一个对象了
再来看一下notify函数:(出一个线程对象,然后唤醒)


上图表明从头部出队列

也就是说,插入顺序是:_WAIT_SET 1 2 3 4 5,获取顺序也是1 2 3 4 5符合FIFO队列先进先出
再来看一下notifyAll函数:(全部唤醒)

由于迭代器用的还是DequeueWaiter,所以这个仍然是顺序出队列,并不是随机的
相关文章:
Java线程的interrupt中断、wait-notify/all(源码级分析)
实例方法: interrupt()方法是设置结束阻塞(sleep、),并且设置中断标记true isInterrupted()判断当前是否中断 静态方法: Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好,既然上面的方法作用是清晰的&…...
计网408考点讲解
IPv4...
当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库
解决方法: ldd 命令来验证程序是否加载了正确的库: 如检查linear_elasticity可执行文件缺少的库,用下面命令: ldd linear_elasticity 可以发现下面not found就是缺少的库,还有对应的库的位置已经版本 $ ldd lin…...
文件下载的几种方式
1、使用window.open方法 url: 可以为文件存放的地址 function downloadFile(url) {window.open(url); }2、使用<a>标签进行文件下载 <a href"/多因素登录说明文档.pdf" class"link-text">说明文档</a> 3、使用fetch和Blob对象 这种…...
车联网安全学习之TBOX
Telematics BOX,简称 T-BOX,也称远程信息处理控制单元(Telematics Control Unit, TCU),集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...
访问http网页强制跳转到了https的解决办法
目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因:HSTS(HTTP Strict Transport Security)什么是 HSTS?HSTS 的工作原理 如何解决?1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息:在 Firef…...
3D 生成重建016-SA3D从nerf中分割一切
3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标: SAM 是一种强大的二维视觉基础模型,能够在 2D 图像中进行任意物体的分割。传统上,SAM 在二维空间表现出色,但其无…...
阿里云整理(二)
阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程: 用户在浏览器输入域名URL,例如www.baidu.com。 不过,浏览器并不知道为该域名提供服务的服务器具…...
qt基本部分控件用法(一)
前言: 以前 windows下做工具主要是MFC,趁有点空时间,研究了QT,感觉跟MFC 差不多,VS 比 QT CREATOR 还是强大,不过QT可以跨平台,功能更强大,MFC 只能在win平台下.; 1:环境…...
【Linux】环境ChatGLM-4-9B 模型之 openai API 服务
一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…...
Too many open files 问题处理
某个简单的 python 服务,运行一段时间就崩溃。查看日志后发现有一个系统错误 OSError: Errno24 Too many open files要理解这个问题,首先要理解什么是文件描述符,可以参考我的另一篇文章(Linux 系统文件描述符(File Descriptor&a…...
CentOS 7 环境下常见的操作和配置
目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd(/etc/vsftpd/vsftpd.conf) 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…...
HTTP(超文本传输协议)
HTTP是万维网通信的基础构成,是一个简单的请求相应协议,基于TCP之上80号端口 通信原理 DNS解析 将域名甩个DNS服务器解析,将域名化为IP访问 建立TCP连接 如图,客户端先发送一个sys置位seq为x(任意值)的…...
etcd-v3.5release-(3)-readIndexRead
笔记1:读操作包括两种,readIndex和serilizable,readIndex指一致性读,一旦a读到了数据x,那么a及a以后的数据都能读到x,readIndex读会先确认本leader是不是有效地leader,如果有效则记录此刻的comm…...
IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置
NA消息用单播还是多播的判断理由 单播回复(Unicast): 如果客户端发送 RS 消息时,使用的是一个全局地址或链路本地地址作为源地址,则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量,…...
C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数
知识要点:数组作函数参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序,前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...
PostgreSQL数据库连接:psqlODBC驱动安装与配置实战指南
本文还有配套的精品资源,点击获取 简介:本文将提供详细的psqlODBC驱动程序在Windows操作系统上的安装和配置指南,使用户能够通过ODBC标准连接到PostgreSQL数据库。安装步骤涵盖获取安装文件、运行安装向导、选择安装路径、完成安装以及配置…...
【NLP 8、normalization归一化函数:sigmoid、softmax】
目录 Normalization(归一化) 1.特点 目的 应用场景 输出范围 2. Sigmoid 函数 目的 应用场景 输出范围 3. Softmax 函数 目的 应用场景 输出范围 "燃尽最后的本能,意志力会带你杀出重围" —— 24.12.2 Normalization&#…...
鸿蒙ArkTS 与安卓Android-底层逻辑对比
鸿蒙OS(ArkTS) 架构: 鸿蒙OS采用了微内核架构,其核心操作系统将设备的硬件资源和服务进行模块化,微内核负责最基本的服务(如调度、通信、同步等),而其他功能则由用户空间的进程提供。…...
第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】
摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计算机显示直线,它确定应该选择的n维光栅的点&#…...
运算放大器与比较器的本质区别及应用指南
1. 运算放大器与比较器的本质区别在电子电路设计中,运算放大器(Op-Amp)和电压比较器(Comparator)是两种极为常见却又经常被混淆的器件。它们在外观符号上几乎一模一样:都有五个引脚——正负电源端、同相与反…...
电路板焊接缺陷解析与预防指南
1. 电路板焊接缺陷全解析作为一名硬件工程师,焊接就像吃饭喝水一样是必备技能。但即使是最资深的工程师,也难免会遇到各种焊接问题。今天我就结合自己多年的实战经验,为大家详细剖析16种最常见的焊接缺陷,从外观特征到成因分析&am…...
【深度解析】用 Superpowers 改造 AI 编码代理:从“快手实习生”到“有流程的工程师”
摘要 本文从 Superpowers 开源项目出发,拆解它背后的「AI 软件开发方法论」:如何通过技能(Skills)、子代理(Sub-agents)、规则(Rules)和 Git 工作流,让 AI 编码代理不再只…...
如何快速掌握MelonLoader:从零基础到精通Unity游戏模组加载的完整教程
如何快速掌握MelonLoader:从零基础到精通Unity游戏模组加载的完整教程 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader …...
CYBER-VISION零号协议互联网舆情智能监测与分析系统
CYBER-VISION零号协议:构建你的互联网舆情智能监测雷达 最近和几个做市场、公关的朋友聊天,他们都在抱怨同一个问题:每天花大量时间刷新闻、看社交媒体,就为了捕捉行业动态和用户反馈,生怕错过什么重要信息。人工监测…...
GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化
GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化 1. 引言 想为特定业务场景定制一个强大的多模态AI模型?GLM-4.1V-9B-Base作为支持图文理解与生成的大模型,通过微调可以快速适配各种下游任务。本文将带你从零开始ÿ…...
三种主流技术方案,实现文本差异并排对比与可视化
1. 文本差异对比的技术需求与场景分析 在代码审查、文档修订或数据比对等场景中,文本差异对比功能就像给内容做"CT扫描",能快速定位修改痕迹。我经历过多次团队协作时找不到修改点的尴尬,直到系统化地测试了三种主流技术方案。**并…...
别再傻傻分不清了!一文搞懂微信支付代金券和商家券的核心区别与适用场景
微信支付代金券VS商家券:技术选型与场景化应用指南 在数字化营销的浪潮中,优惠券作为连接商户与消费者的重要纽带,其技术实现方式直接影响营销效果与用户体验。微信支付提供的代金券与商家券看似功能相似,实则存在架构级差异。本文…...
告别HEIC预览盲区:让Windows用户轻松驾驭苹果图像格式
告别HEIC预览盲区:让Windows用户轻松驾驭苹果图像格式 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 问题场景࿱…...
PROJECT MOGFACE自动化办公助手:集成Python脚本处理Excel与生成报告
PROJECT MOGFACE自动化办公助手:告别重复劳动,让报告自己“写”自己 你是不是也受够了每周、每月那些格式固定的数据报告?从一堆Excel表格里复制粘贴数据,再绞尽脑汁组织语言,最后排版成一份像样的文档。这个过程枯燥…...
