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

Java的Interrupt与线程中断

中断状态

每一个线程都有一个boolean属性,表示中断状态,初始值为false。

中断线程:Thread.interrupt()

正常情况下,只是将线程的中断状态变为true。线程中可以通过轮询中断状态,做出相应的处理。
如果线程在阻塞状态下,线程将退出阻塞且中断状态将被清除(即为false),且会抛出InterruptException。
(IO操作忽略)

查询中断状态

(1)isInterrupted(),返回当前的中断状态,不会改变中断状态。
(2)static interrupted(),返回当前中断状态,且会清除中断状态。(即第二次调用将返回 false)

处理InterruptedException

(1)继续抛出。
如果抛出InterruptedException意味着是一个阻塞方法,那么调用一个阻塞方法则意味着调用者也是一个阻塞方法,应该有某种策略来处理InterruptedException。
(2)捕获InterruptedException,执行清理,再重新抛出InterruptedException。
(3)再次调用interrupt()。
当由Runnable定义的任务调用一个可中断的方法时,在这种情况下,不能重新抛出InterruptedException,因为Runnable接口的run方法不允许抛出异常。
当一个阻塞方法检测到中断并抛出InterruptedException但是不能重新抛出它,那么应该保留中断发生的证据,以便调用栈中更高层的代码能知道中断,并对中断做出响应,该任务可以通过调用interrupt()以重新中断当前线程来完成。

public void run() {
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) {
             // Restore the interrupted status
             Thread.currentThread().interrupt();
         }
    }

中断一个不支持中断的类

如一个IO类会阻塞线程,但不支持中断。则可以写一个新IO类,继承Thread类,重写interrupt方法,在interrupt中关闭IO,最后调用super.interrupt();

待决中断

在进入阻塞前被中断,被称为待决中断。
在调用阻塞方法时,会立刻抛出InterruptException。

参考文章:多线程-interrupt(),isInterrupted(),interrupted() - 小路不懂2

相关文章:

  • Go 领军人物谢孟军:智能制造渴望银弹,首先要摒弃偏见
  • Spark2.4.0源码分析之WorldCount ShuffleMapTask处理(八)
  • 技术总结(持续更新,偏自己看)
  • 小程序 setData 学问多
  • 洛谷P5163 WD与地图
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 轻松防止服务器被黑
  • spring cloud构建互联网分布式微服务云平台-服务网关zuul
  • 了解语音交互:从“若琪,今天杭州的天气”发生了什么?
  • 阿里云SLB出现502 Bad Gateway 错误排查解决方法
  • bat(DOS)常用命令详解
  • 力扣(LeetCode)357
  • 来,膜拜下android roadmap,强大的执行力
  • JS · \r\n被转义导致出错
  • [译] 每天一段 Spring 5 官方文档(5.1.4.RELEASE)—— Spring Framework Overview 10
  • ----------
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Akka系列(七):Actor持久化之Akka persistence
  • Cookie 在前端中的实践
  • ES6--对象的扩展
  • go语言学习初探(一)
  • java2019面试题北京
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Javascript编码规范
  • Java教程_软件开发基础
  • js作用域和this的理解
  • mysql外键的使用
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • VUE es6技巧写法(持续更新中~~~)
  • 反思总结然后整装待发
  • 手写一个CommonJS打包工具(一)
  • 微信支付JSAPI,实测!终极方案
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 数据库巡检项
  • 说说我为什么看好Spring Cloud Alibaba
  • 移动端高清、多屏适配方案
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​queue --- 一个同步的队列类​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #Linux(帮助手册)
  • $.ajax()
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (分布式缓存)Redis哨兵
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)图像的%2线性拉伸
  • (转) Face-Resources
  • (转)Sql Server 保留几位小数的两种做法
  • (转)菜鸟学数据库(三)——存储过程
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)原始图像数据和PDF中的图像数据
  • (轉)JSON.stringify 语法实例讲解
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...