我在Java中启动子进程的方式如下:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
现在它已经在后台运行了。一切都很好。
如果我的程序现在崩溃了(它仍然在开发中:-)),子进程似乎仍然停留在那里。我该如何使它在父Java进程死亡时自动结束?
如果有帮助的话,我正在使用Mac OS X 10.5
我在Java中启动子进程的方式如下:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
现在它已经在后台运行了。一切都很好。
如果我的程序现在崩溃了(它仍然在开发中:-)),子进程似乎仍然停留在那里。我该如何使它在父Java进程死亡时自动结束?
如果有帮助的话,我正在使用Mac OS X 10.5
像你所说的那样,addShutdownHook 是一个好办法。
但是:
如果程序终止,不能保证一定会执行你的关闭钩子。有人可能会杀掉Java进程,在这种情况下你的关闭钩子将不会被执行。(如在这个SO问题中所述)
一些标准库可能具有自己的钩子,这些钩子可能会在你的钩子之前运行。
要小心死锁。
另一种可能性是将你的Java程序封装为服务。
我已经自己解决了。我添加了一个关闭钩子,如下所示:
final String[] cmd = {"<childProcessName>"};
final Process process = Runtime.getRuntime().exec(cmd);
Runnable runnable = new Runnable() {
public void run() {
process.destroy();
}
};
Runtime.getRuntime().addShutdownHook(new Thread(runnable));