如何在Java中closures自己的线程?
这是一个简短的问题。 在某个时候,我的线程明白它应该自杀。 什么是最好的办法做到这一点:
- Thread.currentThread()中断();
- 返回;
顺便说一下,为什么在第一种情况下,我们需要使用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; }
当然,返回是最好的方法。
如果您处于顶级水平,或者能够干净地达到顶级水平,那么只要返回就很好。 抛出一个exception并不是那么干净,因为你需要能够检查没有任何东西能够捕捉exception并且忽略它。
你需要使用Thread.currentThread()
来调用interrupt()
是interrupt()
是一个实例方法 – 你需要在你想要中断的线程上调用它,在你的情况下恰好是当前线。 请注意,只有在下一次线程阻塞(例如IO或监视器)时才会注意到中断 – 这并不意味着立即抛出exception。
如果你只是简单地调用interrupt()
,线程将不会自动closures。 相反,如果isInterrupted()
是相应实现的,Thread甚至可以继续生存。 按照OP的要求,保证closures线程的唯一方法是
Thread.currentThread().stop();
但是,方法已被弃用。
调用return
仅从当前方法返回。 这只会终止线程,如果你在顶层。
不过,你应该使用interrupt()
构build你的代码。
线程是一个类,而不是一个实例; currentThread()是一个静态方法,它返回与调用线程相对应的Thread实例。
使用(2)。 中断()对于正常使用来说有点残酷。