如何从Java中的另一个线程中杀死一个线程?
我从一个主线程调用两个线程,将它们称为线程1和线程2.当线程1停止时,我想要停止或终止线程2。我怎样才能做到这一点?实际输出有我想要的变化。那就是有一个主类,它也是线程。从主类我调用thread1和thread2.I给主线类的thread1输入,但是当这个输入发生变化时,我想杀死正在运行的thread1,并用另一个输入再次启动它。第二个线程thread2将以thread1给出的输出运行。最终,当第一个线程被杀死时,第二个线程将运行但只有在该线程的输入有效时才会给出输出。如何从Java中的另一个线程中杀死一个线程?
Java已经废弃了显式杀死另一个线程(如Thread.stop/Thread.destroy)的方法。正确的方法是确保另一个线程上的操作可以处理被告知停止(例如,他们期望InterruptedException,这意味着您可以调用Thread.interrupt()来停止它)。
您可能还有兴趣将第二个线程设置为daemon thread,这意味着如果虚拟机中的所有其他线程都已完成,则该进程将退出。
请参阅this Java Specialist article关于如何干净地关闭线程。
简而言之,文章建议Thread.interrupt()
加上适当的InterruptedException
在线程代码处理。这本身就是一个有趣的讨论,而且我很少看到正确的做法。
该文章是一篇很棒的阅读材料,并且建议任何人没有足够的时间阅读Doug Lea的Java并发编程 – abyx
在线程的run()
方法中,当您要停止线程时,请检查通过访问方法(如shutdown()
)设置的属性,并使用该值结束while循环。例如:
boolean stopping = false;
Thread currentThread = null;
public void run() {
currentThread = Thread.currentThread();
while (!isStopping()) {
// do something, sleep a while
}
}
public synchronized void shutdown() {
stopping = true;
currentThread.notifyAll();
}
public synchronized boolean isStopping() {
return stopping;
}
非常感谢您的建议,但是请您帮助我正确指定它。 – Raji