这是一个简短的问题。在某些时候,我的线程明白它应该自杀。最好的方法是什么:
顺便说一下,为什么在第一种情况下我们需要使用currentThread
? Thread
是否未引用当前线程?
答案 0 :(得分:63)
如果要终止线程,那么只需返回即可。你不需要调用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
}
答案 1 :(得分:18)
如果run方法结束,则线程将结束。
如果使用循环,正确的方法如下:
// In your imlemented Runnable class:
private volatile boolean running = true;
public void run()
{
while (running)
{
...
}
}
public void stopRunning()
{
running = false;
}
当然,回归是最好的方式。
答案 2 :(得分:5)
如果您处于顶层 - 或者能够干净地获得到线程的顶层 - 那么只需返回就可以了。抛出异常不是那么干净,因为你需要能够检查没有任何东西可以捕获异常并忽略它。
您需要使用Thread.currentThread()
来调用interrupt()
的原因是interrupt()
是一个实例方法 - 您需要在要中断的线程上调用它,在你的情况恰好是当前的线程。请注意,只有在下次线程阻塞时(例如IO或监视器)才会注意到中断 - 这并不意味着立即抛出异常。
答案 3 :(得分:5)
如果您只是致电interrupt()
,则该线程不会自动关闭。相反,如果相应地实现isInterrupted()
,则线程甚至可以继续生活。按照OP的要求,保证关闭一个线程的唯一方法是
Thread.currentThread().stop();
不推荐使用方法。
调用return
仅从当前方法返回。如果您处于最顶层,这只会终止该线程。
尽管如此,您应该使用interrupt()
并围绕它构建代码。
答案 4 :(得分:1)
线程是一个类,而不是一个实例; currentThread()是一个静态方法,它返回与调用线程对应的Thread实例。
使用(2)。中断()对于正常使用来说有点残酷。