我从一个主线程调用两个线程,称它们为线程1和线程2.当线程1停止时,我也想停止或杀死线程2。我怎么能这样做?我想要的实际输出有一个变化。那就是一个主类也是thread.From主类我调用thread1和thread2.I从主类给出一个输入但是当这个输入被改变时我想杀死正在运行的thread1并再次用另一个输入启动它。第二个线程,thread2将运行thread1给出的输出。所以当第一个线程被杀死时,第二个线程将被运行但只有当t6是该线程的输入时才会给出输出。
答案 0 :(得分:13)
Java已经弃用了显式杀死另一个线程的方法(比如Thread.stop / Thread.destroy)。正确的方法是确保另一个线程上的操作可以处理被告知停止(例如,他们期望一个InterruptedException,这意味着你可以调用Thread.interrupt()来阻止它。)
您可能还有兴趣将第二个线程设置为daemon thread,这意味着如果VM中的所有其他线程都已完成,则该进程将退出。
答案 1 :(得分:6)
请参阅this Java Specialist article,了解如何干净地关闭线程。
简而言之,本文建议Thread.interrupt()
加上线程代码中的相应InterruptedException
处理。这本身就是一个有趣的讨论,而且我很少看到正确的事情。
答案 2 :(得分:2)
根据these instructions,最好使用标志变量来告诉其他线程干净地停止其工作。
答案 3 :(得分:1)
在线程的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;
}