0

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

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

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

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

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

想法?

4

2 回答 2

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);行,它将阻塞等待线程终止,这在这种情况下永远不会发生。

于 2013-10-09T12:25:51.693 回答
0

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

于 2013-11-13T16:20:32.600 回答