当我的Java应用程序退出/崩溃时,如何摆脱Java子进程?

我用Java启动子进程如下:

final String[] cmd = {""}; Process process = Runtime.getRuntime().exec(cmd); 

它现在在后台运行。 一切都好又好。

如果我的程序现在崩溃(它仍然在开发:-)),子进程似乎仍然存在。 如何在父Java进程终止时自动结束?

如果有帮助,我使用的是Mac OS X 10.5

正如你所说, addShutdownHook是要走的路。

但:

  • 如果程序终止,则无法确保执行关闭挂钩。 有人可能会杀死Java进程,在这种情况下,您的关闭挂钩将不会被执行。 (如本SO问题所述)

  • 一些标准库有自己的钩子,可以在你的之前运行。

  • 小心死锁。

另一种可能性是将java程序包装在服务中 。

我已经自己解决了。 我添加了一个关闭钩子,如下所示:

 final String[] cmd = {""}; final Process process = Runtime.getRuntime().exec(cmd); Runnable runnable = new Runnable() { public void run() { process.destroy(); } }; Runtime.getRuntime().addShutdownHook(new Thread(runnable));