线程的中断"interrupt"
线程的"中断"不是让线程停止
java中线程的中断(interrupt)只是改变了线程的中断状态,这个中断状态改变后带来的结果,是无法确定的,
有时它更是让停止中的线程继续执行的唯一手段.不但不是让线程停止运行,反而是继续执行线程的手段.
一个线程在调用interrupt()后,自己不会抛出InterruptedException异常,
如果线程a正在执行while(条件) x ++;
你调用a.interrupt();后线程会继续正常地执行下去.
但是,它的状态是已中断的.这个状态对于正在执行wait,join,sleep的线程,却改变了线程的运行结果.
1.对于wait中等待notify/notifyAll唤醒的线程,其实这个线程已经"暂停"执行,这时如果它的中断状态被改变,那么它就会抛出异常InterruptedException
(注意:这里的异常由wait方法抛出而不是由线程抛出的)
此异常表明这个线程不能再等待了,等同于唤醒
(和notify或者notifyAll的区别是:被notify/All唤醒的线程会继续执行wait下面的语句,而在wait中被中断的线程则进入catch语句.
一些正常的逻辑要被放到catch中来运行.)
有时这是唯一手段:
比如一个线程a在某一对象b的wait中等待唤醒,其它线程必须获取到对象b的锁才能调用b.notify()[All],
否则无法唤醒线程a,但在任何线程中可以无条件地调用a.interrupt();来达到这个目的.
只是唤醒后的逻辑要放在catch中
当然同 notify/All一样,继续执行a线程的条件还是要等拿到b对象的锁.
2.对于sleep中的线程,如果你调用了Thread.sleep(一年);现在你后悔了,想让它早些醒过来,调用interrupt()方法就是唯一手段,
只有改变它的中断状态,让它从sleep中进入catch语句中,然后再由catch中的处理转换到正常的逻辑.
同样,join中的线程你也可以这样处理.
对于一般介绍多线程模式的书上,他们会这样来介绍:当一个线程被中断后,在进入wait,sleep,join方法时会抛出异常.
这有什么意义?什么场景下使用它?
interrupt方法让wait,join,sleep中方法的"暂停"状态中恢复过来,包含两层目的:
一.[可以使线程继续执行],那就是在catch语句中招待醒来后的逻辑,或由catch语句转回正常的逻辑.
二.[可以直接停止线程的运行],当然在catch中什么也不处理,或return,那么就完成
了当前线程的使命,可以使在上面"暂停"的状态中立即真正的"停止".
中断线程:(这里指停止线程的运行)
一个正在看电视的孩子,听到大人说快去睡觉去,就立即睡觉去了.这样的孩子是不乖的.
结束一个线程,我们要分析线程的运行情况.也就是线程正在干什么.如果那个孩子什么事也没干,那就让他立即去睡觉.
而如果那个孩子正在看电视,我们就要让它把电视关好再睡觉.
所以一个线程从运行到真正的结束,应该有三个阶段:
1.正常运行.
2.处理结束前的工作,也就是准备结束.
3.结束退出.
线程在结束前的工作应该在finally中来保证线程退出前一定执行:
try{
正在逻辑
}catch(){}
finally{
清理工作
}
让线程结束不能调用stop方法,只能使用interrupt方法
对于一般逻辑,只要线程状态为已经中断,我们就可以让它退出,所以这样的语句可以保证线程在中断后就能结束运行:
while(!isInterrupted()){
正常逻辑
}
这样如果这个线程被调用interrupt()方法,isInterrupted()为true,就会退出运行.
但是如果线程正在执行wait,sleep,join方法,你调用interrupt()方法,
还应该增加一些逻辑,代码如下:
public void run(){
try{
while(!isInterrupted()){
正常工作
}
}
catch(Exception e){
return;
}
finally{
清理工作
}
}
如果线程执行一般逻辑在调用innterrupt后.isInterrupted()为true,退出循环后执行清理工作后结束,
即使线程正在wait,sleep,join,也会捕获异常执行清理工作后退出.
如果捕获异常的代码为如下写法(没有返回):
catch(Exception e)
{
}
wait方法检查到isInterrupted()为true,抛出异常,而你又没有处理.而一个抛出了InterruptedException的线程的状态马上就会被置为非中断状态,
如果catch语句没有处理异常,则下一次循环中isInterrupted()为false,线程会继续执行
================================interruptException方法=============================
比如Thread.sleep(), wait(), join()。
这些方法的执行通常需要比较长的时间来完成,当代码执行到阻塞方法时,一般要等待该方法返回后
才能继续往下执行,而InterruptedException提供了一种特殊的机制提前结束阻塞方法。
分享到:
相关推荐
用户接口 进程管理 处理机管理 存储管理 文件系统 外部设备管理
C++11关于thead的应用,利用std::condition std::mutex提供如何中断,停止和继续功能,
java线程中断之interrupt和stop.docx
Java线程中断示例程序的代码清单.pdf 学习资料 复习资料 教学资源
线程中断 Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了...
} catch (InterruptedException e) {//处理完中断异常后,返回到run()方法入口//如果没有return,线程不会实际被中断,
动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...
主要介绍了Java多线程中断机制三种方法及示例,向大家分享了这三种方法的介绍几代码示例,具有一定参考价值,需要的朋友可以了解下。
主要介绍了Java并发编程示例(四):可控的线程中断,在本节,我们将使用一个线程查找指定目录及其子目录下文件来演示通过使用InterruptedException异常控制线程中断,需要的朋友可以参考下
访问路径为:http://localhost:8080/web001/test.do?flag=xxyyzz&switch=off 其中switch开关参数取值有两种:on和off,on表示执行线程对应的任务,off表示中断线程正在执行的任务。
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法...线程的中断是指在一个线程中断另一个线程的执行。在Java中,可以使用Thread类的interrupt()方法实现线程的中断。(run方法执行完毕)
主要介绍了Java检测线程中断状态的方法,结合实例形式分析了java针对线程中断状态检测的相关实现技巧,需要的朋友可以参考下
主要介绍了java多线程中断代码详解,具有一定参考价值,需要的朋友可以了解下。
给大家分享了java线程中断的办法以及相关知识点内容,有需要的朋友们可以学习参考下。
中断器–运行一个函数,可以从另一个线程中断它 使用范例 import { runInterruptible , interrupt } from 'interruptor' ; runInterruptible ( handle => { // pass handle to another thread using .postMessage()...
在本篇文章中我们给大家分享了关于Java线程中断的相关知识点内容以及相关代码实例,有兴趣的朋友们可以学习下。
线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程...
锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中...线程中断 3.10 完成DownloadManager 3.11 线程中的过时方法 3.12 DownloadFiles类 3.13 未捕捉的异常 3.14 自愿放弃...
主要介绍了Java并发编程示例(三):线程中断,在本节,我们所开发的示例程序将会创建一个线程,五秒钟后,利用中断机制强制中止这个线程,需要的朋友可以参考下
Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下