如何从Java中的另一个线程中删除一个线程?

时间:2009-11-05 13:19:41

标签: java multithreading

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

4 个答案:

答案 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;
}