作为基于linux的java应用程序执行的一部分,main()创建了线程。
我们希望保护我们的应用程序,以便如果main()由于一些无法预料的情况而退出,所有线程都将被杀死并且不会像僵尸那样停留。
问题 - 主线程可以以不同的方式死亡,而不是干净的退出或异常 如果我们捕获任何RuntimeException,在main()和 等待所有线程完成,我们安全吗?根本没有僵尸的问题?
应用程序内部的解决方案(在java代码中实现)或应用程序外部的解决方案(shell脚本)或两者的混合,一切都很好。
想法?
答案 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就会退出,无论有多少守护程序线程仍在运行。所有仍在运行的守护程序线程都被强制终止。