线程如何在Java中关闭?

时间:2010-03-22 10:57:32

标签: java multithreading interrupt

这是一个简短的问题。在某些时候,我的线程明白它应该自杀。最好的方法是什么:

  1. Thread.currentThread()中断();
  2. 返回;
  3. 顺便说一下,为什么在第一种情况下我们需要使用currentThreadThread是否未引用当前线程?

5 个答案:

答案 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)。中断()对于正常使用来说有点残酷。