一个线程应该如何在Java中自行关闭?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

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

  1. Thread.currentThread()中断();
  2. return;

顺便说一下,为什么在第一种情况下我们需要使用currentThread?是Thread不是指当前的线程?

提问于
用户回答回答于

如果你想终止线程,那么只需返回就可以了。你不需要调用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
}
用户回答回答于

如果run方法结束,线程将结束。

如果你使用循环,一个正确的方法如下:

// In your imlemented Runnable class:
private volatile boolean running = true;

public void run()
{
   while (running)
   {
      ...
   }
}


public void stopRunning()
{
    running = false;
}

当然,返回是最好的方式。

扫码关注云+社区