我们怎样才能检测main()线程是否已经死亡但是所有生成的线程()都在运行?

时间:2013-10-09 12:23:59

标签: java process

作为基于linux的java应用程序执行的一部分,main()创建了线程。

我们希望保护我们的应用程序,以便如果main()由于一些无法预料的情况而退出,所有线程都将被杀死并且不会像僵尸那样停留。

问题 - 主线程可以以不同的方式死亡,而不是干净的退出或异常 如果我们捕获任何RuntimeException,在main()和 等待所有线程完成,我们安全吗?根本没有僵尸的问题?

  • 如果存在这种可能性,其他线程如何检测我们的main()线程是否已死,
  • 如果我们找到了一种检测方法,我们如何终止主要创建的所有线程。

应用程序内部的解决方案(在java代码中实现)或应用程序外部的解决方案(shell脚本)或两者的混合,一切都很好。

想法?

2 个答案:

答案 0 :(得分:4)

对您创建的主题使用Thread.setDaemon(true)。当主线程退出时,那些线程也会退出。请参阅以下测试程序:

public class TestThreads {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
    }
}   

class MyThread extends Thread {    
    public MyThread() {
         setDaemon(true);
    }    
    @Override
    public void run() {
        while (true) {
            try {
                System.out.println("Sleeping");
                sleep(1000);
            }
            catch (InterruptedException e) {
                return;
            }
        }
    }
}

如果按原样运行,程序几乎会立即终止。如果你注释掉setDaemon(true);行,它将阻止等待线程终止,这在这种情况下永远不会发生。

答案 1 :(得分:0)

只要有一些非守护程序线程在运行,JVM就不会退出。一旦所有非守护程序线程终止,JVM就会退出,无论有多少守护程序线程仍在运行。所有仍在运行的守护程序线程都被强制终止。