如何在Java中closures自己的线程?

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

  1. Thread.currentThread()中断();
  2. 返回;

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

如果你想终止线程 ,那么只是返回是好的。 你不需要调用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; } 

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

如果您处于顶级水平,或者能够干净地达到顶级水平,那么只要返回就很好。 抛出一个exception并不是那么干净,因为你需要能够检查没有任何东西能够捕捉exception并且忽略它。

你需要使用Thread.currentThread()来调用interrupt()interrupt()是一个实例方法 – 你需要在你想要中断的线程上调用它,在你的情况下恰好是当前线。 请注意,只有在下一次线程阻塞(例如IO或监视器)时才会注意到中断 – 这并不意味着立即抛出exception。

如果你只是简单地调用interrupt() ,线程将不会自动closures。 相反,如果isInterrupted()是相应实现的,Thread甚至可以继续生存。 按照OP的要求,保证closures线程的唯一方法是

 Thread.currentThread().stop(); 

但是,方法已被弃用。

调用return仅从当前方法返回。 这只会终止线程,如果你在顶层。

不过,你应该使用interrupt()构build你的代码。

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

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