转自:http://414149609.iteye.com/blog/1204591
一、没有任何语言方面的需求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断。
我一直都以为调了thread.interrupt()后,线程就立刻停止(类似已被废弃的stop函数),如果真的这样,那会让尚未处理完的数据和状态处于不可知的情况,容易导致不可预计的问题。interrupt更像一个通知,将Thead里的中断标志位设为true,而线程能否退出,就看用户的代码对于这个通知是怎么处理的了。
二、对于处于sleep,join等操作的线程,如果被调用interrupt()后,会抛出InterruptedException,然后线程的中断标志位会由true重置为false,因为线程为了处理异常已经重新处于就绪状态。
我在运行thinking in java里中断的例子时,一直都很奇怪为什么在catch(InterruptedException e)的处理段里,thead.isInterrupted()返回的都是false,原来是已被重置。
三、循环任务线程的中断
1、任务类里做一个信号变量boolean isStopped。循环每次都检查信号量,如果外部逻辑将isStopped设为true,则线程退出。
2、利用线程类已有的信号量isInterrupted。由于sleep、join、wait等操作会抛出中断异常,然后中断标志会被紧接着重置,所以需要做好异常处理。有两种推荐的编码结构:
1.public void run() {
2. try {
3. ...
4. /*
5. * 不管循环里是否调用过线程阻塞的方法如sleep、join、wait,这里还是需要加上
6. * !Thread.currentThread().isInterrupted()条件,虽然抛出异常后退出了循环,显
7. * 得用阻塞的情况下是多余的,但如果调用了阻塞方法但没有阻塞时,这样会更安全、更及时。
8. */
9. while (!Thread.currentThread().isInterrupted()&& more work to do) {
10. do more work
11. }
12. } catch (InterruptedException e) {
13. //线程在wait或sleep期间被中断了
14. } finally {
15. //线程结束前做一些清理工作
16. }
17.}
1.public void run() {
2. while (!Thread.currentThread().isInterrupted()&& more work to do) {
3. try {
4. ...
5. sleep(delay);
6. } catch (InterruptedException e) {
7. Thread.currentThread().interrupt();//重新设置中断标示
8. }
9. }
10.}
四、不可中断的操作,包括进入synchronized段以及Lock.lock(),inputSteam.read()等,调用interrupt()对于这几个问题无效,因为它们都不抛出中断异常。如果拿不到资源,它们会无限期阻塞下去。
对于Lock.lock(),可以改用Lock.lockInterruptibly(),可被中断的加锁操作,它可以抛出中断异常。等同于等待时间无限长的Lock.tryLock(long time, TimeUnit unit)。
对于inputStream等资源,有些(实现了interruptibleChannel接口)可以通过close()方法将资源关闭,对应的阻塞也会被放开。
分享到:
相关推荐
java线程中断之interrupt和stop.docx
Java线程中断示例程序的代码清单.pdf 学习资料 复习资料 教学资源
Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了中断标志...
线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程...
Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
本文将详细介绍java线程阻塞中断和LockSupport的使用,需要了解更多的朋友可以参考下
3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...
给大家分享了java线程中断的办法以及相关知识点内容,有需要的朋友们可以学习参考下。
java线程和容器专题课程第一部分,共两部分。详细讲解java线程的一些知识和技术原理。从性能的⻆度看,如果没有任务会阻塞,那么在单处理器机器上就没有意义使用多线程。java的线程机制是抢占式的,这表示调试 机制...
本篇文章对Java线程中断的本质与编程原则进行了详细的概述,需要的朋友参考下
在本篇文章中我们给大家分享了关于Java线程中断的相关知识点内容以及相关代码实例,有兴趣的朋友们可以学习下。
java中断线程的正确姿势完整示例.rar
之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下
JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止
主要介绍了Java多线程中断机制三种方法及示例,向大家分享了这三种方法的介绍几代码示例,具有一定参考价值,需要的朋友可以了解下。
Java如何中断一个正在运行的线程[整理].pdf
动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...
主要介绍了Java并发编程示例(四):可控的线程中断,在本节,我们将使用一个线程查找指定目录及其子目录下文件来演示通过使用InterruptedException异常控制线程中断,需要的朋友可以参考下
在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的...