interrupt、interrupted、isInterrupted方法详解

interrupt方法的源码:

public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0();  //仅仅对当前线程的中断位进行标记b.interrupt();return;}}interrupt0();     // Just to set the interrupt flag
}

源码说明:
private volatile Interruptible blocker;
private native void interrupt0();
变量blocker表示中断状态(interrupt status),blocker的值默认是null。 interrupt0()方法是本地方法,其作用是仅仅对当前线程的中断位进行标记。线程的中断标志位默认是false,interrupt0()方法将线程的中断标志位设置为true,设置线程的中断状态。清除线程的中断状态,就是将中断标志位设置为false。

当线程调用interrupt方法时,会进入到同步代码块中,由于blocker==null,所以不执行if语句中的代码,而是调用interrupt0()方法,将线程的中断标志位设置为true。所以调用interrupt方法不能中断线程,只是设置线程的中断状态

调用sleep、wait或join等方法的线程,如果再调用interrupt方法,将会抛出InterruptedException异常,或者调用interrupt方法的线程,如果再调用sleep、wait或join等方法,也会抛出InterruptedException异常。

interrupted和isInterrupted方法的源码:

public static boolean interrupted() {return currentThread().isInterrupted(true);
}public boolean isInterrupted() {return isInterrupted(false);
}private native boolean isInterrupted(boolean ClearInterrupted);

interruptedisInterrupted方法的相同点都是判断线程的中断状态(interrupted status)是否被设置(即标志位是否为true),若被设置返回true,否则返回false。区别有两点:一:前者是static方法,调用者是current thread,而后者是普通方法,调用者是this thread。二:它们其实都调用了Java中的一个native方法isInterrupted(boolean ClearInterrupted); 不同的是前者传入了参数true,后者传入了false,意义就是:前者将清除线程的interrupt state(将线程的中断标志位设置为false),后者对线程的interrupt state没有影响。

public void interrupt();

向线程发送中断请求,线程的中断标志位将被设置为true。如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者Thread类的join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,将抛出InterruptedException异常,且线程的中断状态将被清除。

调用interrupt方法是在线程中打了一个停止标志,并不是真的停止线程。其作用是中断此线程此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。可通过interrupted和isInterrupted方法判断中断标志,进而结束线程。此线程是指调用interrupt方法的线程,如Thread t = new Thread();t.interrupt();线程t调用了interrupt方法,所以此线程就是指线程t

public static boolean interrupted();

如果当前线程已经中断,则返回 true;否则返回 false。

interrupted方法的作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态。由于第一次调用interrupted方法时,中断状态已经被清除,第二次再调用interrupted方法时将返回一个false。在哪个线程中调用了interrupted方法,该线程就是当前线程,如在main线程中有如下语句,Thread t = new Thread();t.interrupted();虽然是线程t调用了interrupted方法,但是,是在main线程中调用的interrupted方法,main线程就是当前线程

public boolean isInterrupted();

如果此线程已经中断,则返回 true;否则返回 false。

测试线程是否已经中断,线程的中断状态不受该方法的影响。作用是只测试此线程是否被中断,不清除中断状态。此线程是指调用isInterrupted方法的线程,如在main线程中有如下语句,Thread t = new Thread();t.isInterrupted();即使是在main线程中,但线程t调用了isInterrupted方法,所以此线程就是指线程t

interrupted与isInterrupted方法的区别:interrupted方法是判断当前线程是否被中断,并清除中断状态,而isInterrupted方法是判断此线程是否被中断,不清除中断状态。

示例:

public class MyThread extends Thread {@Overridepublic  void run() {for (int i = 0; i < 10; i++) {System.out.println("i="+(i+1));}}
}public class Test{public static void main(String[] args ) {MyThread thread=new MyThread();thread.start();thread.interrupt();System.out.println("第一次调用thread.isInterrupted():"+thread.isInterrupted());System.out.println("第二次调用thread.isInterrupted():"+thread.isInterrupted());//测试interrupted()函数System.out.println("第一次调用thread.interrupted():"+thread.interrupted());System.out.println("第二次调用thread.interrupted():"+thread.interrupted());System.out.println("thread是否存活:"+thread.isAlive());}
}

测试结果如下所示:

thread线程调用了interrupt方法,并没有使thread线程立即中断,只是将thread线程的中断标志设置为true(线程的中断状态被设置),通过thread.isInterrupted方法判断线程的中断状态是否被设置,若被设置了,则返回true,否则返回false。从输出结果看,可能会有疑惑,为什么后面两个interrupted方法输出的都是false,而不是预料中的一个true一个false?注意!!!这是一个坑!!!上面说到,interrupted方法测试的是当前线程是否被中断,这里当前线程是main线程,而thread.interrupt中断的是thread线程,这里的此线程就是thread线程。所以当前线程main从未被中断过,尽管interrupted方法是以thread.interrupted的形式被调用,但它检测的仍然是main线程而不是检测thread线程,所以thread.interrupted在这里相当于main.interrupted。

若调用sleep()而使线程处于阻塞状态,这时调用interrupt()方法,会抛出InterruptedException,从而使线程提前结束阻塞状态,退出阻塞代码。为什么

1.默认blocker=null; ®1

2.调用方法“interrupt0();”将会导致该线程的中断状态将被设置(JDK文档中术语)”®2

3.再次调用“interrupt0();”将会导致其中断状态将被清除(JDK文档中术语)”®3

异常其实是interrupt()抛出的,而不是sleep()抛出的。

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

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

相关文章

yarn 下载安装、下载依赖、通过 vscode 运行服务(Windows11)

目录 yarn工具前置要求&#xff1a;安装node.js并配置好国内镜像源下载安装下载依赖特别的&#xff1a; 启动服务 yarn 工具 系统&#xff1a;Windows 11 前置要求&#xff1a;安装node.js并配置好国内镜像源 参考&#xff1a;本人写的《node.js下载、安装、设置国内镜像源…

JDK8 Kylin jdk-8u341-linux-x64.tar.gz

JDK8 Kylin jdk-8u341-linux-x64.tar.gz chmod 777 jdk-8u341-linux-x64.tar.gz tar -zxvf jdk-8u341-linux-x64.tar.gz chmod 777 -R jdk1.8.0_341 vi /etc/profile ESC :wq source /etc/profile java -version eclipse JRE tomcat

ssm基于vue框架和elementui组件的手机官网+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框…

如何封装一个可取消的 HTTP 请求?

前言 你可能会好奇什么样的场景会需要取消 HTTP 请求呢&#xff1f; 确实在实际的项目开发中&#xff0c;可能会很少有这样的需求&#xff0c;但是不代表没有&#xff0c;比如&#xff1a; 假如要实现上述这个公告栏&#xff0c;每点击一个 tab 按钮就会切换展示容器容器中…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

sqlserver、达梦、mysql调用存储过程(带输入输出参数)

1、sqlserver&#xff0c;可以省略输出参数 --sqlserver调用存储过程&#xff0c;有输入参数&#xff0c;有输出参数--省略输出参数 exec proc_GetReportPrintData 1, , , 1--输出参数为 null exec proc_GetReportPrintData 1, , , 1, null--固定输出参数 exec proc_GetReport…

leetcode 1470.重新排列数组

1.题目要求: 2.题目代码: class Solution { public:vector<int> shuffle(vector<int>& nums, int n) {vector<int> x_array(nums.begin(),nums.begin() n);vector<int> y_array(nums.begin() n,nums.end());int x_index 0;int y_index 0;for…

各地级市能源消耗量数据-基于灯光数据的反演(2000-2022年)

今天带来的数据是的全国各省市能源消耗量数据&#xff0c;省级的能源消耗量数据可以在统计年鉴之中查到&#xff0c;但市级的数据却暂无统计。但今天我们基于一篇论文提供的思路&#xff0c;通过夜间灯光与省级能源消耗量对更小尺度的地区能源消耗量进行反算。原文提供1995-200…

微服务设计模式 - 重试模式(Retry Pattern)

微服务设计模式 - 重试模式&#xff08;Retry Pattern&#xff09; 定义 重试模式&#xff08;Retry Pattern&#xff09;是一种微服务中的设计模式&#xff0c;用于在临时性失败&#xff08;如网络故障或暂时不可用的服务&#xff09;发生时&#xff0c;自动重新尝试请求&…

从源码到成品应用:互联网医院系统与在线问诊APP的开发全解析

今天将全面解析互联网医院系统和在线问诊APP的开发过程&#xff0c;从源码到成品应用&#xff0c;帮助您理解其中的关键技术和实施策略。 一、系统架构设计 互联网医院系统和在线问诊APP的开发首先需要一个合理的系统架构。通常&#xff0c;系统架构分为前端和后端两个部分。…

简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

ZooKeeper 客户端API操作

文章目录 一、节点信息1、创建节点2、获取子节点并监听节点变化3、判断节点是否存在4、客户端向服务端写入数据写入请求直接发给 Leader 节点写入请求直接发给 follow 节点 二、服务器动态上下线监听1、监听过程2、代码 三、分布式锁1、什么是分布式锁?2、Curator 框架实现分布…

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…

计算机图形学中向量相关知识chuizhi

一、向量加法 平行四边形法则 两个向量统一起点&#xff0c;构成平行四边形&#xff0c;对角线为向量加和的结果 三角形法则 两个向量尾首相连&#xff0c;从a起点连接到b终点&#xff0c;为向量加法的结果 多向量首尾相连的加法结果为第一个向量的起点到最后一个向量的终点…

私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?

私有化视频平台EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 有用户反馈&#xff0c;项目现场使用RTMP协议接入EasyCVR平台&#xff0c;但是视频却不…

【教程】Git 标准工作流

目录 前言建仓&#xff0c;拉仓&#xff0c;关联仓库修改代码更新本地仓库&#xff0c;并解决冲突提交代码&#xff0c;合入代码其他常用 Git 工作流删除本地仓库和远程仓库中的文件日志打印commit 相关 前言 Git 是日常开发中常用的版本控制工具&#xff0c;配合代码托管仓库…

VMware workstation的3种网络类型

虚拟机想要和主机进行通信必须借助网桥或者交换机&#xff0c;VMware workstation提供了3种网络交换机&#xff1a;仅主机类型交换机、NAT类型交换机、桥接类型交换机。 介绍下这三种类型的交换机 仅主机类型 通过VMware workstation添加一个仅主机类型的虚拟交换机后&#…

【RAG】自动化RAG框架-“AutoML风”卷到了RAG?

AutoML&#xff08;自动机器学习&#xff09;是指通过自动化过程&#xff0c;简化机器学习模型的开发、训练和优化&#xff0c;使非专业用户也能有效地构建高性能模型。 今天分享的自动RAG框架&#xff0c;该框架能够自动识别给定数据集的合适RAG模块。自动RAG探索并近似数据集…

Qt/C++地图雷达扫描/动态扇形区域/标记线实时移动/轮船货轮动态轨迹/雷达模拟/跟随地图缩放

一、前言说明 地图雷达扫描的需求场景也不少&#xff0c;很多人的做法是直接搞个覆盖层widget&#xff0c;在widget上绘制雷达&#xff0c;优缺点很明显&#xff0c;优点是性能高&#xff0c;毕竟直接在widget上绘制性能明显比js中绘制要高&#xff0c;缺点是要么动态计算经纬…

CodeS:构建用于文本到 SQL 的开源语言模型

发布于&#xff1a;2024 年 10 月 29 日 #RAG #Text2 SQL #NL2 SQL 语言模型在将自然语言问题转换为 SQL 查询&#xff08;文本到 SQL &#xff09;的任务中显示出良好的性能。然而&#xff0c;大多数最先进的 &#xff08;SOTA&#xff09; 方法都依赖于强大但闭源的大型语言…