我正在使用ProcessBuilder启动子进程,并且如果父进程执行,则需要子进程退出.在正常情况下,我的代码正在正确地阻止孩子.但是,如果我导致操作系统杀死父级,则子级将继续运行.
有没有办法将子进程"绑定"到父进程,这样当父进程被杀时它会退出?
类似的问题:
考虑以下简单的代码,永远打印"Hi world":
public class WakeMeUpSomehow {
public static void main(String[] args) {
while (true) {
try {
System.out.println( " Hi world ");
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出:

有没有办法设计一个外部的第三个程序,它监视这个程序,以便在我们杀死它时注意到(如命令行中的CTRL + C); 然后这个"父"程序恢复"Hello World"运行?
我认为它可能看起来像这样:

所以我的问题是 - 如何模拟这样的代码,具有这种故障安全功能?有办法做到这一点吗?
谢谢 !
编辑:我在这里找到了一个相关的简洁链接,但解决了一些不同的东西 - 如何重新启动Java应用程序?
我正在寻找有关java main方法的 更多知识public static void main(String[] args).当JVM调用main方法时,它会创建Main线程,并且整个程序在此Main线程中执行,直到某个用户线程在其自己的堆栈中显式启动.
我的问题是,是否可以main从其他main方法启动线程?
如果有人能给我一些关于主线程的参考,那就更好了.
我刚刚安装了最新的JDK 7 Update 21并编写了以下单行程序(在Windows 7上):
public static void main(String[] args) {
System.out.println("java.home = " + System.getProperty("java.home"));
}
Run Code Online (Sandbox Code Playgroud)
输出(令人惊讶):
java.home = D:\Java\jdk1.7.0_21\jre
Run Code Online (Sandbox Code Playgroud)
我相信我修复了所有常见原因:
以下是您的信息的更多输出
D:\Temp>echo %PATH%
d:\Java\jdk1.7.0_21\bin
D:\Temp>echo %JAVA_HOME%
D:\Java\jdk1.7.0_21
D:\Temp>type SystemInfo.java
public class SystemInfo {
public static void main(String[] args) {
System.out.println("java.home = " + System.getProperty("java.home"));
}
}
D:\Temp>java -verbose SystemInfo
[Opened d:\Java\jdk1.7.0_21\jre\lib\rt.jar]
[Loaded java.lang.Object from d:\Java\jdk1.7.0_21\jre\lib\rt.jar]
[Loaded java.io.Serializable from d:\Java\jdk1.7.0_21\jre\lib\rt.jar]
...
[Loaded java.lang.Void from d:\Java\jdk1.7.0_21\jre\lib\rt.jar]
java.home = d:\Java\jdk1.7.0_21\jre …Run Code Online (Sandbox Code Playgroud)