在 Java 中线程应该如何关闭自己?

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

  1. 中断() ;
  2. 报税表;

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

151127 次浏览

如果您处于线程的顶层——或者能够干净利落地从 走开到顶层——那么只需返回就可以了。抛出异常并不干净,因为您需要能够检查是否没有什么能够捕获异常并忽略它。

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

Thread 是一个类,而不是一个实例; currentThread ()是一个静态方法,它返回与调用线程对应的 Thread 实例。

使用(2)。中断()对于正常使用来说有点残酷。

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

如果使用循环,正确的方法是这样的:

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


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




public void stopRunning()
{
running = false;
}

当然回去是最好的办法。

如果您想终止 线,那么只需返回即可。你不需要调用 Thread.currentThread().interrupt()(它不会做任何坏事,虽然。只是你不需要这么做。)这是因为 interrupt()基本上用于通知线程的所有者(好吧,不是100% 准确,但是有点准确)。因为您是线程的所有者,并且您决定终止线程,所以不需要通知任何人,所以不需要调用它。

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

是的,没有。我猜它可能会令人困惑,因为例如 Thread.sleep ()会影响当前线程,但 Thread.sleep ()是一个静态方法。

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

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

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

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

Catch(InterruptedException ie){
//ignore
}

因为如果你这样做了,你就停止了这条信息,而应该这样做

Catch(InterruptedException ie){
Thread.currentThread().interrupt();//preserve the message
return;//Stop doing whatever I am doing and terminate
}

如果您只是调用 interrupt(),线程将不会自动关闭。相反,如果相应地实现了 isInterrupted(),那么线程甚至可以生存在 继续中。按照 OP 的要求,保证 差不多线程的唯一方法是

Thread.currentThread().stop();

但是,不推荐使用。

调用 return只能从当前方法返回。如果处于线程的最高级别,这只能终止线程。

不过,您应该使用 interrupt()并围绕它构建代码。