这是一个简短的问题。在某种程度上,我的线程明白,它应该自杀。最好的方法是什么:
顺便问一下,为什么在第一种情况下我们需要使用 currentThread?Thread不引用当前线程吗?
currentThread
Thread
如果您处于线程的顶层——或者能够干净利落地从 走开到顶层——那么只需返回就可以了。抛出异常并不干净,因为您需要能够检查是否没有什么能够捕获异常并忽略它。
为了调用 interrupt(),您需要使用 Thread.currentThread()的原因是 interrupt()是一个实例方法——您需要在希望中断的线程上调用它,在您的情况下,这恰好是当前线程。请注意,中断只有在下次线程阻塞时才会被注意到(例如,对于 IO 或监视器) ,这并不意味着异常会立即抛出。
interrupt()
Thread.currentThread()
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% 准确,但是有点准确)。因为您是线程的所有者,并且您决定终止线程,所以不需要通知任何人,所以不需要调用它。
Thread.currentThread().interrupt()
顺便说一下,为什么在第一种情况下,我们 是否需要使用 currentThread 没有引用当前线程?
是的,没有。我猜它可能会令人困惑,因为例如 Thread.sleep ()会影响当前线程,但 Thread.sleep ()是一个静态方法。
如果你不是线程的所有者(例如,如果你没有扩展 Thread和编码 Runnable等) ,你应该这样做
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 的要求,保证 差不多线程的唯一方法是
isInterrupted()
Thread.currentThread().stop();
但是,不推荐使用。
调用 return只能从当前方法返回。如果处于线程的最高级别,这只能终止线程。
return
不过,您应该使用 interrupt()并围绕它构建代码。