有如下的程序:
public class LockedOwnThread extends Thread {
public void run () {
while(true) {
synchronized (this) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// 这里永远都输出false
System.out.println("In Exception:" + this.isInterrupted());
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
LockedOwnThread lt = new LockedOwnThread();
lt.start();
// 发出中断信号
lt.interrupt();
// 在这里能检查到中断状态
System.out.println(lt.isInterrupted());
}
}
在上面的程序中,启动线程后立刻发出中断信号,紧接着在主线程中能迅速检查到中断状态,但是在Exception中永远都无法检查到中断状态,始终都为false。
在没有任何操作的前提下,中断状态却表现出两种截然不同的值,这是为什么呢?
原来当线程在非阻塞状态下中断时,系统为它设置中断状态,但是,只要触发了InterruptedException,那么中断状态将会被清除,所以在上面的代码中,在cath(InterruptedException e)代码块中,永远也检查不到中断状态为true。
结论
千万不要在cath(InterruptedException e)代码块里判断中断状态,因为它始终为假。