为什么在 catch 块中调用方法 Thread.currentThread.interrupt()
?
原文由 Hesey 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么在 catch 块中调用方法 Thread.currentThread.interrupt()
?
原文由 Hesey 发布,翻译遵循 CC BY-SA 4.0 许可协议
我认为这个代码示例让事情变得更清楚了。完成这项工作的班级:
public class InterruptedSleepingRunner implements Runnable {
@Override
public void run() {
doAPseudoHeavyWeightJob();
}
private void doAPseudoHeavyWeightJob() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
// You are kidding me
System.out.println(i + " " + i * 2);
// Let me sleep <evil grin>
if (Thread.currentThread().isInterrupted()) {
System.out.println("Thread interrupted\n Exiting...");
break;
} else {
sleepBabySleep();
}
}
}
protected void sleepBabySleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Main
类:
public class InterruptedSleepingThreadMain {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new InterruptedSleepingRunner());
thread.start();
// Giving 10 seconds to finish the job.
Thread.sleep(10000);
// Let me interrupt
thread.interrupt();
}
}
尝试在不设置状态的情况下调用中断。
原文由 Ajay George 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
这样做是为了 _保持状态_。
当您捕获
InterruptedException
并吞下它时,您基本上可以防止任何更高级别的方法/线程组注意到中断。这可能会导致问题。通过调用
Thread.currentThread().interrupt()
,您设置了线程的中断标志,因此更高级别的中断处理程序将注意到它并可以适当地处理它。Java 并发实践 在 第 7.1.3 章:响应中断 中对此进行了更详细的讨论。它的规则是: