卢声远*_* Lu 20 java concurrency multithreading
我找到了JavaDoc的方法:
返回:如果此线程已被中断,则返回true; 否则是假的.
我认为我对这种方法的理解有些不对劲.此外,我可能会误解Thread中的"中断"概念.
欢迎任何解释!谢谢!
代码段:
在线程定义中:
public void run() {
try {
//Do something
} catch (InterruptedException e) {
System.out.println(isInterrupted());//Always false
return;
}
}
Run Code Online (Sandbox Code Playgroud)
引用:
theThread.interrupt();
Run Code Online (Sandbox Code Playgroud)
Ste*_*n C 35
此行为通常记录在抛出该异常的方法中.例如,javadoc Object.wait()表示:
"
InterruptedException- 如果任何线程在当前线程等待通知之前或当前线程中断当前线程.当抛出此异常时,将清除当前线程的中断状态. "
实际上,异常的javadoc本身就是这样说的:
"偶尔一个方法可能希望测试当前线程是否已被中断,如果是,则立即抛出此异常.以下代码可用于实现此效果:
Run Code Online (Sandbox Code Playgroud)if (Thread.interrupted()) // Clears interrupted status! throw new InterruptedException();
请注意他们如何强调在抛出异常之前应该清除该标志.
它为什么设计成这样工作?您必须询问设计人员,但我希望他们认为异常处理程序应该处理这种情况,因此应该不需要在该点设置该标志.(如果处理程序没有完全处理这种情况,它可以重新抛出异常,或者调用Thread.getCurrentThread.interrupt()再次设置标志.)
添加到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(); //
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14865 次 |
| 最近记录: |