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