我找到了JavaDoc的方法:
返回: 如果此线程已被中断,则为true;否则就是假。
我认为我对该方法的理解有问题。此外,我可能会误解Thread中的“中断”概念。
欢迎任何解释!谢谢!
代码段:
在线程定义中:
public void run() {
try {
//Do something
} catch (InterruptedException e) {
System.out.println(isInterrupted());//Always false
return;
}
}
调用:
theThread.interrupt();
答案 0 :(得分:35)
此行为通常记录在抛出该异常的方法中。例如,Object.wait()
的javadoc表示:
“
InterruptedException
- 如果任何线程在当前线程等待通知之前或当前线程中断当前线程。当抛出此异常时,将清除当前线程的中断状态。 强>“的
事实上,异常的javadoc本身就是这样说的:
“偶尔方法可能希望测试当前线程是否已被中断,如果是,则立即抛出此异常。以下代码可用于实现此效果:
if (Thread.interrupted()) // Clears interrupted status! throw new InterruptedException();
注意他们强调如何在抛出异常之前清除标志。
为什么它的设计是这样的?您必须询问设计人员,但我希望他们认为异常处理程序应处理情况,因此应该不需要在该点设置该标志。 (如果处理程序没有完全处理这种情况,它可以重新抛出异常,或者调用Thread.getCurrentThread.interrupt()
再次设置标志。)
答案 1 :(得分:16)
抛出异常后,线程不再处于中断状态。
答案 2 :(得分:6)
添加到cdhowie的答案,一个标准模式是让Thread处理中断。这对于Executors很有用,当运行的代码不“拥有”线程时,不应该妨碍中断(除非你真的知道你在做什么)
public void run() {
try {
//Do something
} catch (InterruptedException e) {
// Do whatever local clean up you need to
...
// Then let the owning Thread know it's been interrupted, so it too can clean up
Thread.currentThread().interrupt(); //
}
}
答案 3 :(得分:1)
您可以在自己的代码中检查isInterrupted(),例如从循环中检查。如果线程被中断,则可以抛出InterruptedException以停止执行。
在您的示例中,如果您发现InterruptedException,您可以确定它已被中断,您不必检查该方法。