本文最后更新于48 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
线程中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。其他线程通过调用该线程的interrupt方法进行中断操作。反过来,线程通过isInterrupt()方法判断自己是否被执行了中断反应,并作出响应。
线程A想要中断线程B,可以调用interrupt方法发送中断信号,线程B自己决定是否响应中断。[/spoiler]
InterruptedException:如果一个线程已经被sleep、wait等方法而休眠了,这个线程再被调用中断方法时会抛出InterruptedException异常。
在抛出InterruptedException异常之前,Java虚拟机会将这个线程的中断标记清除,然后再抛出InterruptedException,此时调用isInterrupted()方法会返回false。
为什么线程A给线程B发送了中断信号,不能强行停止线程B,而是让线程B自行选择?
部分工作如果突然停止那么数据会是不完整的,对于线程A来说,线程A感知不到线程B进行到什么阶段,因此无法在合适时机停止线程B。
比如线程B正在写入文件,此时正写入一半,线程A发来中断信号,此时最稳妥的方法就是完成数据写入之后再响应中断信号。
对于停止线程的其他方法,如stop()、suspend()和resume(),这些方法现在已经被Java标记为@Deprecated,IDE会提示我们最好不要使用他们,因为他们会直接把线程停止,而不六祖足够时间让线程处理数据保存等。
Java中interrupt、interrupted、isInterrupt的区别?
interrupt:用于中断线程,调用该方法的线程状态为将被置为“中断”状态(中断线程不会停止线程)
interrupted:静态方法,查看当前中断信号是true还是false并且清除中断信号,如果一个线程被中断了,第一次调用interrupted则返回true,第二次和后面就返回false。
isInterrupted:也是可以返回当前中断信号是true还是false,与interrupted最大的区别就是不会清除中断信号