Java多线程之中断线程(Interrupt)的使用详解

 更新时间:2013年05月04日 14:43:19   作者:  
interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程

interrupt方法

interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程。具体做什么事情由写代码的人决定,通常我们会中止该线程。

    如果线程在调用Object类的wait()、wait(long)或wait(long, int)方法,或者该类的 join() 、join(long) 、join(long, int) 、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

    如果该线程在可中断的通道(java.nio.channels.InterruptibleChannel)上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。

    如果该线程在一个 Selector (java.nio.channels.Selector) 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。

    如果以前的条件都没有保存,则该线程的中断状态将被设置。

    中断一个不处于活动状态的线程不需要任何作用。

检测中断

如何检测中断决定于线程所做的事情。

    如果线程调用可以抛出InterruptException的方法,则捕获InterruptException,然后在catch块中处理(通常是退出run方法以中断线程)

    如果调用其它方法,则可以在空闲时检查Thread.interrupted以判断是否收到中断信号,确认收到中断信号后进行处理。可以抛出一个InterruptException从而和前一种处理方法保持一致

中断状态

线程的中断机制是使用中断状态这一内部标志实现的。中断状态在调用线程的interrupt()方法时被设置(参考上面的interrupt方法说明)。

 

有两种方法可以取得线程的中断状态:

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

    调用指定线程的isInterrupted()方法,该方法只返回指定线程的中断状态而不影响该线程的中断状态。

有两种方法可以清除线程的中断状态:

    如上所述,调用Thread.interrupted()

    调用该线程的interrupt()方法引发InterruptedException的时候同时就已经清除了所在线程的中断状态,包括Object类的wait()、wait(long)或wait(long, int)方法,或者线程的 join() 、join(long) 、join(long, int) 、sleep(long) 或 sleep(long, int) 方法

相关文章

  • Java中的Graphics2D类基本使用教程

    Java中的Graphics2D类基本使用教程

    这篇文章主要介绍了Java中的Graphics2D类基本使用教程,Graphics2D类较之Graphics类中的功能更加专业,需要的朋友可以参考下
    2015-10-10
  • Java 数组差集实例代码

    Java 数组差集实例代码

    这篇文章主要介绍了Java 数组差集实例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • java dump文件怎么生成和分析-JMAP用法详解

    java dump文件怎么生成和分析-JMAP用法详解

    这篇文章主要介绍了java dump文件怎么生成和分析-JMAP用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java手写简易版HashMap的使用(存储+查找)

    Java手写简易版HashMap的使用(存储+查找)

    这篇文章主要介绍了Java手写简易版HashMap的使用(存储+查找),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Spring中使用腾讯云发送短信验证码的实现示例

    Spring中使用腾讯云发送短信验证码的实现示例

    本文主要介绍了Spring 中 使用腾讯云发送短信验证码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java链表中元素删除的实现方法详解【只删除一个元素情况】

    Java链表中元素删除的实现方法详解【只删除一个元素情况】

    这篇文章主要介绍了Java链表中元素删除的实现方法,结合实例形式分析了java只删除链表中一个元素的相关操作原理、实现方法与注意事项,需要的朋友可以参考下
    2020-03-03
  • Spring MVC拦截器(Interceptor)的定义和配置过程

    Spring MVC拦截器(Interceptor)的定义和配置过程

    这篇文章主要介绍了Spring MVC拦截器(Interceptor)的定义和配置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java并发编程之ConcurrentLinkedQueue源码详解

    Java并发编程之ConcurrentLinkedQueue源码详解

    今天带小伙伴们学习一下Java并发编程之Java ConcurrentLinkedQueue源码,本篇文章详细分析了ConcurrentLinkedQueue源码,有代码示例,对正在学习java的小伙伴们很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • 浅谈静态变量、成员变量、局部变量三者的区别

    浅谈静态变量、成员变量、局部变量三者的区别

    下面小编就为大家带来一篇浅谈静态变量、成员变量、局部变量三者的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • spring boot 实现Minio分片上传的步骤

    spring boot 实现Minio分片上传的步骤

    分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件,本文给大家介绍spring boot 实现Minio分片上传的步骤,感兴趣的朋友跟随小编一起看看吧
    2023-10-10

最新评论