Java线程,中断异常正确处理

wfsdck30  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(143)

为什么第二个例子比第一个更好?有人能解释一下吗
//1

public void run()
{
    while (. . .)
    {
        . . .
        try 
        { 
            . . .
            Thread.sleep(delay); 
            . . .
        } catch (InterruptedException exception) {}  
            . . .
        }
    }
}

//2

public void run() {
    try {
        while (. . .) {
         . . .
         Thread.sleep(delay);
         . . .
        }
    } catch (InterruptedException exception) {
        . . .
    } 
}

我听说第一个例子,当InterruptedException发生时,它不会终止线程,但我仍然不明白为什么。

5sxhfpxr

5sxhfpxr1#

两者都不好--这取决于你打算做什么。
第二个例子将在InterruptedException时中断while循环,第一个例子将只中断一个迭代,线程将继续下一个迭代。
原因是当在Thread.sleep()内部抛出InterruptedException时,它将中断所有执行,直到应用catch块(或者,如果没有找到这样的块,则线程终止)。在第二个例子中,这个catch在循环之外,因此在执行catch之后,循环就消失了。
但是考虑一下为什么你的线程首先被中断。正如Ole所说:别再做你刚才在做的事了。如果需要执行一些清理工作,然后退出。
这可能意味着您必须退出循环。这可能意味着你必须留在循环中,或者运行一些“撤消”循环。但无论如何,您必须处理这个线程实际上需要终止的事实。由于抛出InterruptedException会清除线程的interrupted标志,因此通常明智的做法是使用Thread.currentThread().interrupt()再次设置interrupted标志。
如果你的应用程序需要执行清理,请参见Runtime.addShutdownHook(),因为类似的概念也适用于中断的线程:

  • 关机钩子也应该快速完成它们的工作。当一个程序调用exit时,期望的是虚拟机将立即关闭并退出。当虚拟机由于用户注销或系统关闭而终止时,底层操作系统可能仅允许关闭和退出的固定时间量。因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算。

相关问题