这是一个简短的问题。在某种程度上,我的线程明白它应该自杀。最好的方法是什么:
顺便问一下,为什么在第一种情况下我们需要使用currentThread
?Thread
不引用当前线程吗?
发布于 2010-03-22 19:23:54
如果你想终止线程,那么只需返回即可。您不需要调用Thread.currentThread().interrupt()
(尽管它不会做任何坏事。只是你不需要这样做。)这是因为interrupt()
基本上是用来通知线程的所有者的(嗯,不是100%准确,但在某种程度上)。因为您是线程的所有者,并且您决定终止线程,所以没有人需要通知,所以您不需要调用它。
顺便问一下,为什么在第一种情况下我们需要使用currentThread?线程是否未引用当前线程?
我猜它可能会让人感到困惑,比如Thread.sleep()会影响当前线程,但Thread.sleep()是一个静态方法。
如果您不是线程的所有者(例如,如果您没有扩展Thread
并编写Runnable
等)你应该这样做
Thread.currentThread().interrupt();
return;
这样,任何调用你的runnable的代码都会知道线程被中断了=(通常)应该停止它正在做的事情并终止它。正如我之前所说的,它只是一种沟通机制。所有者可能会简单地忽略中断状态,什么也不做。但是,如果您设置了中断状态,将来可能会有人为此感谢您。
出于同样的原因,您永远不应该这样做
Catch(InterruptedException ie){
//ignore
}
因为如果你这样做了,你就停止了这条消息。相反,人们应该做的是
Catch(InterruptedException ie){
Thread.currentThread().interrupt();//preserve the message
return;//Stop doing whatever I am doing and terminate
}
发布于 2010-03-22 19:03:15
如果run方法结束,线程也将结束。
如果您使用循环,正确的方式如下所示:
// In your imlemented Runnable class:
private volatile boolean running = true;
public void run()
{
while (running)
{
...
}
}
public void stopRunning()
{
running = false;
}
当然,返回是最好的方式。
发布于 2010-03-22 19:01:15
如果你在线程的顶层--或者能够干净利落地到达顶层--那么直接返回是很好的。抛出异常并不是很干净,因为您需要能够检查没有任何东西会捕获异常并忽略它。
您需要使用Thread.currentThread()
来调用interrupt()
的原因是,interrupt()
是一个实例方法-您需要在您想要中断的线程上调用它,在本例中,该线程恰好是当前线程。请注意,中断只会在线程下一次阻塞(例如,对于IO或监视器)时才会被注意到-这并不意味着立即抛出异常。
https://stackoverflow.com/questions/2491588
复制相似问题