博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发(基础知识)—— Java中断机制
阅读量:6039 次
发布时间:2019-06-20

本文共 2267 字,大约阅读时间需要 7 分钟。

hot3.png

      上文讲解了Java线程的创建、启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解。

      在网上搜索Java中断机制,发现两篇好文章,分别如下: 以及 ,推荐大家仔细阅读。

中断是一种协作机制                                                                                    

      必须记住,中断是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。有些方法,例如 Thread.sleep(),很认真地对待这样的请求,但并不是每个方法一定要对中断作出响应。 您可以随意忽略中断请求,但是这样做的话会影响响应。   

中断状态                                                                                                   

      每个Java线程都有一个与之相关联的 Boolean 属性,该属性用于表示线程的中断状态,Thread类提供了三个方法用于操作中断状态,这些方法包括:

public static boolean interrupted()

 

测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。

public booleanisInterrupted()   测试线程是否已经中断。线程的中断状态不受该方法的影响。
 public voidinterrupt()  中断线程。

      三个方法中,interrupt()方法是唯一能将中断状态设置为true的方法,另外两个方法都是用于检测当前中断状态的方法。 

中断的处理                                                                                                 

      作为一种协作机制,中断机制不会强求被中断线程一定要在某个点进行处理。实际上,被中断线程只需在合适的时候处理中断即可,如果没有合适的时间点,甚至可以不处理,这时候在任务处理层面,就跟没有调用中断方法一样。

      在JDK中,有很多阻塞方法的声明中有抛出InterruptedException异常,这暗示该方法是可中断的,这些方法会检测当前线程是否被中断,如果是,则立刻结束阻塞方法,并抛出InterruptedException异常。如果程序捕获到这些可中断的阻塞方法抛出的InterruptedException或检测到中断后,这些中断信息该如何处理?一般有以下两个通用原则:

  • 如果遇到的是可中断的阻塞方法抛出InterruptedException,可以继续向方法调用栈的上层抛出该异常,如果是检测到中断,则可清除中断状态并抛出InterruptedException,使当前方法也成为一个可中断的方法。
  • 若有时候不太方便在方法上抛出InterruptedException,比如要实现的某个接口中的方法签名上没有throws InterruptedException,这时就可以捕获可中断方法的InterruptedException并通过Thread.currentThread.interrupt()来重新设置中断状态。如果是检测并清除了中断状态,亦是如此。    

      一般的代码中,尤其是作为一个基础类库时,绝不应当吞掉中断,即捕获到InterruptedException后在catch里什么也不做,清除中断状态后又不重设中断状态也不抛出InterruptedException等。因为吞掉中断状态会导致方法调用栈的上层得不到这些信息。

      当然,凡事总有例外的时候,当你完全清楚自己的方法会被谁调用,而调用者也不会因为中断被吞掉了而遇到麻烦,就可以这么做。

不可取消的任务                                                                                           

      有些任务拒绝被中断,这使得它们是不可取消的。但是,即使是不可取消的任务也应该尝试保留中断状态,以防在不可取消的任务结束之后,调用栈上更高层的代码需要对中断进行处理。以下代码展示了一个方法,该方法等待一个阻塞队列,直到队列中出现一个可用项目,而不管它是否被中断。为了方便他人,它在结束后在一个 finally 块中恢复中断状态,以免剥夺中断请求的调用者的权利。

public Task getNextTask(BlockingQueue
queue) { boolean interrupted = false; try { while (true) { try { return queue.take(); } catch (InterruptedException e) { interrupted = true; // fall through and retry } } } finally { if (interrupted) Thread.currentThread().interrupt(); }}

总结                                                                                                          

      中断是一种协作机制,利用该机制我们可以构造灵活的线程取消策略,每个线程都可以自行决定它们是可取消的还是不可取消的,以及如何对中断作出响应,如果立即返回会危害应用程序完整性的话,它们还可以推迟中断。

参考:

      Java 理论与实践: 处理 InterruptedException:

      详细分析Java中断机制:

转载于:https://my.oschina.net/u/197668/blog/361241

你可能感兴趣的文章
想跨界的安防企业,跨界之前你可看准了
查看>>
从这开始了解深度学习——视觉的深度学习与网络
查看>>
特朗普求援硅谷大佬: 可是双方更爱谈题外话
查看>>
十年前内部备忘录精确揭露雅虎最大问题
查看>>
《高阶Perl》——第2章 分配表 2.1 配置文件处理
查看>>
斯坦福Nature论文宣布新突破:AI诊断皮肤癌达专家水平
查看>>
微软:超80%用户已升级至Windows 10周年更新或之后的版本
查看>>
嵌入式存储STT-MRAM取代NOR Flash大势所趋
查看>>
“云灾备”服务提供商深蓝云海完成Pre-A轮融资
查看>>
更安全 快递单上的隐私信息将“隐形”
查看>>
论文解读:Convolutional Sequence to Sequence Learning
查看>>
《VMware、Citrix和Microsoft虚拟化技术详解与应用实践》一2.7 使用vCenter Server管理多台ESXi 5.0...
查看>>
盗版系统惹的祸?Windows 7安装KB3146706会出现蓝屏
查看>>
张家口建设智慧城市迎接冬奥会
查看>>
怎样才算是“优秀的呼叫中心”
查看>>
FLIR推出多款热成像和可见光安防摄像机,发布United VMS重大更新
查看>>
当最难管理的律师遇上量化大数据
查看>>
海尔家居旗下企业定义智能家居3.0+,浩思智慧力推Xgo-有狗
查看>>
中国大数据市场的特点与发展趋势
查看>>
云时代数据安全才是真正的安全 —— 天空卫士 副总裁 巩文坚
查看>>