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 statusThread.currentThread().interrupt();}}
中断一个不支持中断的类
如一个IO类会阻塞线程,但不支持中断。则可以写一个新IO类,继承Thread类,重写interrupt方法,在interrupt中关闭IO,最后调用super.interrupt();
待决中断
在进入阻塞前被中断,被称为待决中断。
在调用阻塞方法时,会立刻抛出InterruptException。
参考文章:多线程-interrupt(),isInterrupted(),interrupted() - 小路不懂2
Java的Interrupt与线程中断相关推荐
- java io中断_Java的Interrupt与线程中断
中断状态 每一个线程都有一个boolean属性,表示中断状态,初始值为false. 中断线程:Thread.interrupt() 正常情况下,只是将线程的中断状态变为true.线程中可以通过轮询中断 ...
- java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别
很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...
- java 线程退出cmd_java 线程的终止与线程中断
关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...
- java 线程池 中断_如何中断(interrupt)线程(thread)(线程池的线程中断我的理解是一个意思)...
1.概述基本实现是,通过 InterruptedException 异常来终止程序,至于线程什么时候终止,只能由jvm来决定了,若理解的不到位,欢迎大牛们指点 2.code 如下 package co ...
- java 线程中断(转)
程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运 ...
- java吵醒线程_一文搞懂 Java 线程中断
在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括: 1. interrupt()说明 2. 终止线程的方式 2.1 终止处于"阻塞状态"的线 ...
- Java中如何实现线程的超时中断
转载自 Java中如何实现线程的超时中断 背景 之前在实现熔断降级组件的时候,需要实现接口请求的超时中断.意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果请求进入熔断器开始计时,接 ...
- 一文搞懂 Java 线程中断
转载自 一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...
最新文章
- 力扣(LeetCode)刷题,简单题(第11期)
- Java项目:资源下载工具(java+swing)
- tensorflow2.0降级及如何从别的版本升到2.0
- ai的弹窗点了都不响应_【评价集合】拼多多评价,你所不知道的点都在这里!...
- 关于table和td的边框设置
- Javascript中{}+[]===0为true,而[]+{}===0为false
- 启动Kafka失败Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 107
- java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)
- python gil原理_Python GIL深入浅出
- Python的迭代器
- 我的世界1.14java原版命令_我的世界:老一辈mc是怎么生存的?鱼骨式挖矿,这些套路你知道吗...
- WPF XMAL获取元素的父元素,子元素
- pythontab_PythonTab 中文网简介
- Unity 安装个人免费版步骤详解
- OpenSIPS实战(一):OpenSIPS使用简介
- 5款常用的数据可视化工具推荐!
- Android 实现一键加QQ群,一键加QQ好友
- win10下载日文输入法时,无法使用日文键盘的问题解决
- ubuntu下搭建不同端口网站
- 华为 CISCO 交换机型号识别
热门文章
- lol手游账号被移至美洲服务器,LOL手游“行窃预兆”遭玩家嫌弃,移除偷钱后成最鸡肋符文?...
- keepalive+lvs负载均衡及高可用总结
- VB得到指定文件夹下的文件列表
- 心情随笔(三):注入新的血液
- 谷歌开源缩放模型EfficientNets:ImageNet准确率创纪录,效率提高10倍
- 现在,TensorRT 4开放下载了
- AI戒毒?没错,北京开始这么干了
- 终于承认!马斯克证实特斯拉在造AI芯片,而且是世上最好的AI硬件
- 论文自动转代码!IBM印度大三实习生搞了个神奇研究(已中AAAI)
- 谁是真凶?《CSI:犯罪现场调查》正帮助AI提高断案能力