总是调用Thread.currentThread().interrupt(); 捕获InterruptedException时?

Mat*_*nge 12 java multithreading

这篇IBM developerWorks文章指出:

"有一次,当你知道线程即将退出时,吞下一个中断是可以接受的.只有在调用可中断方法的类是a的一部分而Thread不是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(){
        // …
    }
}
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,它是一个更好的代码设计,Thread而不是实现Runnable

Bri*_*new 11

它会重置中断标志.这篇JavaS专家通讯更详细地介绍了这个令人困惑的主题.

在我的例子中,在我捕获InterruptedException之后,我使用Thread.currentThread().interrupt()立即再次中断线程.为什么这有必要?抛出异常时,中断的标志被清除,因此如果你有嵌套的循环,你将在外循环中引起麻烦

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