首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,线程应该如何关闭自身?

在Java中,线程应该如何关闭自身?
EN

Stack Overflow用户
提问于 2010-03-22 18:57:32
回答 5查看 144.1K关注 0票数 68

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

  1. Thread.currentThread().interrupt();
  2. return;

顺便问一下,为什么在第一种情况下我们需要使用currentThreadThread不引用当前线程吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-22 19:23:54

如果你想终止线程,那么只需返回即可。您不需要调用Thread.currentThread().interrupt() (尽管它不会做任何坏事。只是你不需要这样做。)这是因为interrupt()基本上是用来通知线程的所有者的(嗯,不是100%准确,但在某种程度上)。因为您是线程的所有者,并且您决定终止线程,所以没有人需要通知,所以您不需要调用它。

顺便问一下,为什么在第一种情况下我们需要使用currentThread?线程是否未引用当前线程?

我猜它可能会让人感到困惑,比如Thread.sleep()会影响当前线程,但Thread.sleep()是一个静态方法。

如果您不是线程的所有者(例如,如果您没有扩展Thread并编写Runnable等)你应该这样做

代码语言:javascript
复制
Thread.currentThread().interrupt();
return;

这样,任何调用你的runnable的代码都会知道线程被中断了=(通常)应该停止它正在做的事情并终止它。正如我之前所说的,它只是一种沟通机制。所有者可能会简单地忽略中断状态,什么也不做。但是,如果您设置了中断状态,将来可能会有人为此感谢您。

出于同样的原因,您永远不应该这样做

代码语言:javascript
复制
Catch(InterruptedException ie){
     //ignore
}

因为如果你这样做了,你就停止了这条消息。相反,人们应该做的是

代码语言:javascript
复制
Catch(InterruptedException ie){
    Thread.currentThread().interrupt();//preserve the message
    return;//Stop doing whatever I am doing and terminate
}
票数 72
EN

Stack Overflow用户

发布于 2010-03-22 19:03:15

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

如果您使用循环,正确的方式如下所示:

代码语言:javascript
复制
// In your imlemented Runnable class:
private volatile boolean running = true;

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


public void stopRunning()
{
    running = false;
}

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

票数 19
EN

Stack Overflow用户

发布于 2010-03-22 19:01:15

如果你在线程的顶层--或者能够干净利落地到达顶层--那么直接返回是很好的。抛出异常并不是很干净,因为您需要能够检查没有任何东西会捕获异常并忽略它。

您需要使用Thread.currentThread()来调用interrupt()的原因是,interrupt()是一个实例方法-您需要在您想要中断的线程上调用它,在本例中,该线程恰好是当前线程。请注意,中断只会在线程下一次阻塞(例如,对于IO或监视器)时才会被注意到-这并不意味着立即抛出异常。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2491588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档