一、使用interrupt()中断线程

2023-11-17

当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。

下面一段代码演示了休眠线程的中断:

 

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

 

 运行结果如下:

 

 

主线程启动新线程后,自身休眠2秒钟,允许新线程获得运行时间。新线程打印信息“about to sleep for 20 seconds”后,继而休眠20秒钟,大约2秒钟后,main线程通知新线程中断,那么新线程的20秒的休眠将被打断,从而抛出InterruptException异常,执行跳转到catch块,打印出“interrupted while sleeping”信息,并立即从run()方法返回,然后消亡,而不会打印出catch块后面的“leaving normally”信息。
    请注意:由于不确定的线程规划,上图运行结果的后两行可能顺序相反,这取决于主线程和新线程哪个先消亡。但前两行信息的顺序必定如上图所示。
    另外,如果将catch块中的return语句注释掉,则线程在抛出异常后,会继续往下执行,而不会被中断,从而会打印出”leaving normally“信息。

二、待决中断

 

    在上面的例子中,sleep()方法的实现检查到休眠线程被中断,它会相当友好地终止线程,并抛出InterruptedException异常。另外一种情况,如果线程在调用sleep()方法前被中断,那么该中断称为待决中断,它会在刚调用sleep()方法时,立即抛出InterruptedException异常。

 

    下面的代码演示了待决中断:

 1 public class PendingInterrupt extends Object {  
 2     public static void main(String[] args){  
 3         //如果输入了参数,则在mian线程中中断当前线程(亦即main线程)  
 4         if( args.length > 0 ){  
 5             Thread.currentThread().interrupt();  
 6         }   
 7         //获取当前时间  
 8         long startTime = System.currentTimeMillis();  
 9         try{  
10             Thread.sleep(2000);  
11             System.out.println("was NOT interrupted");  
12         }catch(InterruptedException x){  
13             System.out.println("was interrupted");  
14         }  
15         //计算中间代码执行的时间  
16         System.out.println("elapsedTime=" + ( System.currentTimeMillis() - startTime));  
17     }  
18 }  

如果PendingInterrupt不带任何命令行参数,那么线程不会被中断,最终输出的时间差距应该在2000附近(具体时间由系统决定,不精确),如果PendingInterrupt带有命令行参数,则调用中断当前线程的代码,但main线程仍然运行,最终输出的时间差距应该远小于2000,因为线程尚未休眠,便被中断,因此,一旦调用sleep()方法,会立即打印出catch块中的信息。执行结果如下:

这种模式下,main线程中断它自身。除了将中断标志(它是Thread的内部标志)设置为true外,没有其他任何影响。线程被中断了,但main线程仍然运行,main线程继续监视实时时钟,并进入try块,一旦调用sleep()方法,它就会注意到待决中断的存在,并抛出InterruptException。于是执行跳转到catch块,并打印出线程被中断的信息。最后,计算并打印出时间差。

 

 

三、使用isInterrupted()方法判断中断状态

   可以在Thread对象上调用isInterrupted()方法来检查任何线程的中断状态。这里需要注意:线程一旦被中断,isInterrupted()方法便会返回true,而一旦sleep()方法抛出异常,它将清空中断标志,此时isInterrupted()方法将返回false。

  下面的代码演示了isInterrupted()方法的使用:

 1 public class InterruptCheck extends Object{  
 2     public static void main(String[] args){  
 3         Thread t = Thread.currentThread();  
 4         System.out.println("Point A: t.isInterrupted()=" + t.isInterrupted());  
 5         //待决中断,中断自身  
 6         t.interrupt();  
 7         System.out.println("Point B: t.isInterrupted()=" + t.isInterrupted());  
 8         System.out.println("Point C: t.isInterrupted()=" + t.isInterrupted());  
 9   
10         try{  
11             Thread.sleep(2000);  
12             System.out.println("was NOT interrupted");  
13         }catch( InterruptedException x){  
14             System.out.println("was interrupted");  
15         }  
16         //抛出异常后,会清除中断标志,这里会返回false  
17         System.out.println("Point D: t.isInterrupted()=" + t.isInterrupted());  
18     }  
19 }  

运行结果如下:

 

四、使用Thread.interrupted()方法判断中断状态

 

   可以使用Thread.interrupted()方法来检查当前线程的中断状态(并隐式重置为false)。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。

    如下代码演示了Thread.interrupted()方法的使用:

 1 public class InterruptReset extends Object {  
 2     public static void main(String[] args) {  
 3         System.out.println(  
 4             "Point X: Thread.interrupted()=" + Thread.interrupted());  
 5         Thread.currentThread().interrupt();  
 6         System.out.println(  
 7             "Point Y: Thread.interrupted()=" + Thread.interrupted());  
 8         System.out.println(  
 9             "Point Z: Thread.interrupted()=" + Thread.interrupted());  
10     }  
11 }  

运行结果如下:

  从结果中可以看出,当前线程中断自身后,在Y点,中断状态为true,并由Thread.interrupted()自动重置为false,那么下次调用该方法得到的结果便是false

补充

    这里补充下yield和join方法的使用。
    join方法用线程对象调用,如果在一个线程A中调用另一个线程B的join方法,线程A将会等待线程B执行完毕后再执行。

    yield可以直接用Thread类调用,yield让出CPU执行权给同等级的线程,如果没有相同级别的线程在等待CPU的执行权,则该线程继续执行。




https://www.cnblogs.com/lt132024/p/6438897.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一、使用interrupt()中断线程 的相关文章

  • 无线传感网WSN

    第一章 绪论 WSN定义 无线传感网络是由大量的静止或移动的传感器以自组织和多跳的方式构成的无线网络 WSN系统组成 传感器节点 汇聚节点和管理节点 WSN的三个基本要素 传感器 感知对象 用户 观测者 WSN特点 1 自组织性 2 以数据
  • android的消息处理机制(图+源码分析)——Looper,Handler,Message

    android的消息处理有三个核心类 Looper Handler和Message 其实还有一个Message Queue 消息队列 但是MQ被封装到Looper里面了 我们不会直接与MQ打交道 因此我没将其作为核心类 下面一一介绍 线程的
  • 03C++11多线程编程之测试join,detach传各种实参时形参的拷贝次数

    03C 11多线程编程之测试join detach传各种实参时形参的拷贝次数 首先我们看下面的总结测试图 然后一步步的测试 1 这里我们先测试join传实参的类型 当实参为普通对象时 1 当形参为普通对象时 拷贝了两次 2 当形参为引用时
  • java中的锁池和等待池

    在java中 每个对象都有两个池 锁 monitor 池和等待池 wait notifyAll notify 三个方法都是Object类中的方法 锁池 假设线程A已经拥有了某个对象 注意 不是类 的锁 而其它的线程想要调用这个对象的某个sy
  • 代码潜在故障的动态分析

    b size large 引子 size b 大家都听说过FindBugs的大名 这是一款静态代码分析的工具 能够直接对字节码文件加以分析 并发现潜在的反模式 anti pattern 从而有效地促进代码质量的改善 但FindBugs只能用
  • Java线程的5种状态及状态之间转换

    Java中的线程的生命周期大体可分为5种状态 1 新建 NEW 新创建了一个线程对象 2 可运行 RUNNABLE 线程对象创建后 其他线程 比如main线程 调用了该对象的start 方法 该状态的线程位于可运行线程池中 等待被线程调度选
  • ThreadLocal,看我就够了!

    ThreadLocal 开胃菜 研究过Handler的应该对ThreadLocal比较眼熟的 线程中的Handler对象就是通过ThreadLocal来存放的 初识ThreadLocal的可能被它的名字有所误导 ThreadLocal初一看
  • CyclicBarrier 使用详解

    1 CyclicBarrier 是什么 从字面上的意思可以知道 这个类的中文意思是 循环栅栏 大概的意思就是一个可循环利用的屏障 它的作用就是会让所有线程都等待完成后才会继续下一步行动 举个例子 就像生活中我们会约朋友们到某个餐厅一起吃饭
  • Linux 线程同步的三种方法

    线程的最大特点是资源的共享性 但资源共享中的同步问题是多线程编程的难点 linux下提供了多种方式来处理线程同步 最常用的是互斥锁 条件变量和信号量 一 互斥锁 mutex 通过锁机制实现线程间的同步 初始化锁 在Linux下 线程的互斥量
  • java多线程使用详解与案例,超详细

    文章目录 线程lamda表达式方式启动 简单 常用 java使用多线程的三种方式 继承Thread 实现Runnable 实现Callable 线程池的使用 守护线程 使用lamda表达式简化java的书写简单化案例如下 多线程综合案例 1
  • Java 线程的生命周期(对应七大状态)

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 线程的生命周期 线程状态的转换 通过代码输出线程的状态 代码如下 public class ThreadState public sta
  • 【最清晰】ThreadLocal和局部变量和成员变量的区别

    ThreadLocal是进程级别的全局变量 最近有一个疑惑 为什么线程类的局部变量不能完全替代ThreadLocal 每一次new 线程都是创建了一个副本啊照理来说也是独立的 为什么还需要ThreadLocal 实际上确实是独立的 但是答案
  • 同步方法及同步代码块

    synchronized方法和synchronized块 synchronized方法必须获得对象的锁才能执行 否则线程阻塞 方法一旦执行 就独占此锁 直到方法返回才释放锁 后面被阻塞的线程才能获得这个锁 继续执行 synchronized
  • wxWidgets开发之多线程wxThread编程

    上节说到使用wxCondition来实现某一消息处理的业务场景的多线程处理方法 在此之前先分享一下wxCondition用法 条件变量 最常用在多线程环境下 用来指示当前所在线程的某些条件已经满足 其他线程可以共享该线程的数据 或者去完成预
  • python多线程编程: 使用互斥锁同步线程

    由于每个线程互相独立 相互之间没有任何关系 你干你的 我干我的 互相不干扰 如果要几个线程同时干一件事怎么办 由于互相不走动 如果一个线程已经做过了 另一个线程再去做 不就重复了吗 很容易乱套 现在假设这样一个例子 有一个全局的计数num
  • 笔试题10:Runnable接口与Thread类的区别?

    1 线程类继承自Thread则不能继承自其它类 而Runnable接口可以 2 线程类继承自Thread相对于Runnable来说 使用线程的方法更方便一些 3 实现Runnable接口的线程类的多个线程 可以更方便的访问同一变量 而Thr
  • c++11std::thread扩展

    最近 整理一下学习c 的文章 看到一篇文章 其中提到了thread local和std future 觉得这两东西很有趣 于是网上搜了一些资料 觉得很有帮助 希望可以对大家学习c 线程有所帮助 http www cnblogs com ha
  • 实时系统RTX之理解一

    文献来源 http wzhyblog yo2 cn articles e5 ae 9e e6 97 b6 e7 b3 bb e7 bb 9frtx e5 ae 98 e6 96 b9 e6 96 87 e6 a1 a3 e4 b8 ad e
  • python基于字典多线程目录枚举工具

    基于字典多线程目录枚举工具 整体思路 命令行参数获取 字典文件的读取 多线程访问 命令行参数获得 使用模块 sys getopt sys argv获取命令行执行的数据 参数获得 opt args getopt getopt sys argv
  • 多核编程学习笔记之OpenMP(一)

    多核编程学习笔记之OpenMP 一 I 配置及简介 1 1 在VC 2008 VC9 0 中 如果没有任何设置 在代码中使用编译指导语句将不会报错 但是也不起作用 1 2 OpenMP发展与优势 1 2 1 OpemMP的规范由SGI发起

随机推荐

  • jQuery 入门教程(14): 添加HTML元素

    使用jQuery可以方便的添加新的HTML元素 下面的方法用于添加HTML元素 append 在指定的元素的尾部添加一个新内容 prepend 在指定的元素里前部添加新内容 after 在指定元素后添加新内容 before 在指定元素的前面
  • Vue3 -- teleport传送门

    目录 teleport传送门 例 蒙层特效 目标效果 代码演示 页面效果 未使用teleport存在的问题 使用teleport实现目标效果 完整代码 总结 teleport传送门 Teleport 是一种能够移动 DOM到Vue根节点之外
  • 自学区块链:原理、技术及应用——什么是区块链(笔记)

    Bitcoin和区块链有很深的渊源 但Bitcoin与区块链两者不能等同 区块链是Bitcoin的底层技术 除了Bitcoin 还有很多其他的区块链技术应用 什么是 区块链 时间戳服务器对以区块 Block 形式存在的一组数据实施随机散列
  • 华为云计算HCIE之oceanstor仿真器的使用操作

    华为云计算HCIE之oceanstor仿真器的使用操作 一 登录检查oceanstor的状态 二 配置存储资源 1 创建硬盘域 2 创建存储池 3 创建LUN 4 创建LUN组 5 创建主机 6 创建主机组 7 创建映射关系 三 配置存储H
  • idea 连接云mysql_IntelliJ IDEA 连接数据库 详细过程

    连接到MySQL数据库 调出Database面板 IDEA配置Database数据源需要我们在IDEA的主界面中找到View gt ToolWindows gt Database 如下图所示 1 选择数据源 在IDEA中新建一个Java工程
  • T系接口源数据格式

    item apiStack name esi value endpoint mode android osVersion 9 26 0 protocolVersion 3 0 ultronage true data dinamic TB d
  • Unity + Jenkins自动打包 (二)构建Jenkins项目以及编写Python、Unity脚本

    1 新建Jenkens项目 在上一篇中 完成了Jenkins的安装和初始化 以及权限设置 查看上一篇 Jenkins安装 点此 现在打开浏览器 输入http localhost 8081 当然 需要改成你自己设置的Jenkins端口号 然后
  • lua c++中的一种回调解决方法

    见很多人发问cocos2dx 3 版本 lua 函数回调问题 我在项目中是这样解决的 因为我是使用了cocos 带有的 lua 绑定脚本 python写的 cocos2d x tools tolua genbindings py 在生成绑定
  • mac .ssh文件位置

    1 Finder gt 前往文件夹 gt 输入 ssh 2 打开终端 输入cd ssh cd ssh
  • vue组件库的开发流程

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 开发流程 1 创建项目 vue cli 公司现有架构 2 调整项目静态目录结构 3 使用webpack相关库模式打包编译 4 使用npm或者公司源地址发布到你需要的
  • 向List Control中添加ACCESS数据内容

    转 给List Control 添加变量tt 加入引入ADO使用智能指针 import c program files common files system ado msado15 dll no namespace rename EOF
  • MySQL - 索引的隐藏和删除

    隐藏索引 MySQL 8开始支持隐藏索引 隐藏索引提供了更人性化的数据库操作 隐藏索引 顾名思义 让索引暂时不可见 不会被优化器使用 默认情况下索引是可见的 隐藏索引可以用来测试索引的性能 验证索引的必要性时不需要删除索引 可以先将索引隐藏
  • 【qt应用软件Focus Note++】

    本专栏介绍了使用Qt开发的一些小型桌面软件 其中包括软件功能介绍 软件截图 主要代码等内容 此外 本专栏还提供完整的软件源码和安装包供有需要的同学下载 我的目标是开发一些简洁美观且实用的客户端小软件 如果能够为大家提供有用的软件或对学习有益
  • 赶紧来修炼内功~字符串函数详解大全(一)

    目录 1 strlen 重点 模拟实现 法一 法二 法三 2 strcpy 重点 模拟实现 3 strcat 重点 模拟实现 4 strcmp 重点 模拟实现 1 strlen strlen函数是用来计算字符串长度的 重点 字符串以 0 作
  • Ipsec phase1 and phase2

    终于明白是怎么回事了 困扰我好多天了 网上的资料鱼龙混杂 直到这位大虾的出现 第一阶段 有主模式和积极模式2种 只有remote vpn和Easy vpn是积极模式的 其他都是用主模式来协商的 让IKE对等体彼此验证对方并确定会话密钥 这个
  • 初探oVirt-体验

    日期 2015 9 2 2016 11 15 time 16 40 主机 node72 node73 node86 node93 目的 初探oVirt 体验 操作内容 一 基础环境 1 官方建议 1 oVirt Engine 需求 最低 双
  • 为OkGo网络请求增加自定义log功能

    OkGo是基于Okhttp3的封装 所以只需要增加自定义拦截器就可以实现自定义log OkGo有一个默认的log拦截器HttpLoggingInterceptor 如果没有特别需求则无需自定义 第一步自定义拦截器 参考OkGo中的拦截器实现
  • ctfshow-web4

    0x00 前言 CTF 加解密合集 CTF Web合集 0x01 题目 0x02 Write Up 和web3是相同的内容 这里可以通过任意文件读取的方式来进行利用 这里根据返回包知道是nginx 默认nginx日志是 var log ng
  • 如何批量上传Maven仓库jar包到Nexus3.x私服

    一 手动mvn命令上传单个Jar mvn deploy deploy file DgroupId com oracle DartifactId ojdbc6 Dversion 10 2 0 1 0 Dpackaging jar Dfile
  • 一、使用interrupt()中断线程

    当一个线程运行时 另一个线程可以调用对应的Thread对象的interrupt 方法来中断它 该方法只是在目标线程中设置一个标志 表示它已经被中断 并立即返回 这里需要注意的是 如果只是单纯的调用interrupt 方法 线程并没有实际被中