gpt4 book ai didi

java - 始终调用 Thread.currentThread().interrupt();捕获 InterruptedException 时?

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:22 27 4
gpt4 key购买 nike

This IBM developerWorks article状态:

“The one time it is acceptable to swallow an interrupt is when you know the thread is about to exit. This scenario only occurs when the class calling the interruptible method is part of a Thread, not a Runnable […]”.

我现在总是为我的线程实现Runnable。像这样提供 Runnable 实现:

public class View() implements Runnable {
@Overload
public void run(){
Thread worker = new Thread(new Worker());
worker.start();
do{
try{
TimeUnit.SECONDS.sleep(3);
updateView();
}catch(InterruptedException e){
worker.interrupt();
// Thread.currentThread().interrupt();
return;
}
}while(true);
}

protected void updateView(){
// …
}
}

真的有必要在我的 return; 语句之前调用 Thread.currentThread().interrupt(); 吗? return; 不是已经执行了一次干净的退出了吗?调用它有什么好处?文章指出应该这样做,否则“[...] 调用堆栈上层的代码将无法找到它 [...]”。在应用程序关闭时,Thread.State.TERMINATED 中设置了中断标志的线程比没有中断标志的线程有什么好处?你能给我一个例子吗?Runnable 之外的代码出于合理的原因检查中断标志?

顺便说一句,扩展 Thread 而不是实现 Runnable 是更好的代码设计吗?

最佳答案

它重置中断标志。这JavaSpecialists newsletter更详细地涵盖了这个令人困惑的话题。

In my example, after I caught the InterruptedException, I used Thread.currentThread().interrupt() to immediately interrupted the thread again. Why is this necessary? When the exception is thrown, the interrupted flag is cleared, so if you have nested loops, you will cause trouble in the outer loops

所以如果你知道你的代码不会被另一个组件使用,那么你就不需要重新中断。但是我真的不会做那个小的优化。谁知道您的代码将来将如何使用/重用(甚至通过复制/粘贴),因此我会为每个中断重置标志。

关于java - 始终调用 Thread.currentThread().interrupt();捕获 InterruptedException 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com