如何从Java中的另一个线程中杀死一个线程?

问题描述:

我从一个主线程调用两个线程,将它们称为线程1和线程2.当线程1停止时,我想要停止或终止线程2。我怎样才能做到这一点?实际输出有我想要的变化。那就是有一个主类,它也是线程。从主类我调用thread1和thread2.I给主线类的thread1输入,但是当这个输入发生变化时,我想杀死正在运行的thread1,并用另一个输入再次启动它。第二个线程thread2将以thread1给出的输出运行。最终,当第一个线程被杀死时,第二个线程将运行但只有在该线程的输入有效时才会给出输出。如何从Java中的另一个线程中杀死一个线程?

Java已经废弃了显式杀死另一个线程(如Thread.stop/Thread.destroy)的方法。正确的方法是确保另一个线程上的操作可以处理被告知停止(例如,他们期望InterruptedException,这意味着您可以调用Thread.interrupt()来停止它)。

您可能还有兴趣将第二个线程设置为daemon thread,这意味着如果虚拟机中的所有其他线程都已完成,则该进程将退出。

根据these instructions,最好使用标志变量来告诉其他线程干净地停止它的工作。

+0

非常感谢您的建议,但是请您帮助我正确指定它。 – Raji

请参阅this Java Specialist article关于如何干净地关闭线程。

简而言之,文章建议Thread.interrupt()加上适当的InterruptedException在线程代码处理。这本身就是一个有趣的讨论,而且我很少看到正确的做法。

+1

该文章是一篇很棒的阅读材料,并且建议任何人没有足够的时间阅读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; 
} 
+0

您的代码有竞争条件,并且您的同步使用很差。它更好地简单地检查当前线程的中断状态,或者如果你必须使用某种标记,至少使它成为原子。 – Kevin

+0

@凯文,你一定错过了*例如*位,这段代码显然只是为了显示解决方案的结构 - 不能按原样使用。 – rsp

+1

@rsp:如果你发布的例子,最好让他们成为很好的例子。如果人们已经知道区分好坏例子,他们就不必在这里问了。 –