Java多线程之中断线程(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 四舍五入运算_JAVA正确的四舍五入方法「建议收藏」
- java scanner怎么用_Java中Scanner类的用法及使用步骤分享!「建议收藏」
- java生成license_使用truelicense实现用于JAVA工程license机制(包括license生成和验证)…
- java 自定义的类加载器_Java如何自定义类加载器[通俗易懂]
- Java方法重载_java入门方法的使用
- Java学习笔记之六java三种循环(for,while,do……while)的使用方法及区别详解编程语言
- 数据库解锁Java,优雅连接Oracle数据库(java使用oracle)
- 中的应用Java中MySQL的灵活运用(mysql在java代码)
- 【Java】使用socket实现控制台多线程聊天室详解编程语言
- 服务器使用Java进行Linux服务器监控(java监控linux)
- Java下使用Redis进行高效缓存优化(Redis缓存java)
- 面试前准备:Java技术和Redis快速入门(java面试redis)
- Linux环境中如何顺利执行Java程序?(linux下执行java)
- 深入浅出 使用 Java 连接 Neo4j(java连接neo4j)
- 使用Java轻松读取Redis数据 – 一步一步指南!(java读取redis)
- Java程序如何在Linux上顺利部署?快来了解一下!(java部署到Linux)
- 使用Java实现MySQL数据恢复操作(java恢复mysql)
- 使用Java监听MySQL数据库变化(java监听mysql)
- 使用Java类连接MSSQL数据库(mssql连接java类)
- 使用Java连接MySQL数据库的具体操作方法(java连接mysql代码)
- Java更新提升Oracle软件性能(java更新oracle)
- 基于Java回顾之多线程同步的使用详解
- java多线程编程之慎重使用volatile关键字