2012-02-01 44 views
1

我剛剛意識到,我開始的所有進程在JVM退出時並不會死亡。有沒有辦法讓我用JVM退出關閉Process,有點像File.deleteOnExit()我可以讓JVM在退出時終止啓動的進程嗎?

+1

在大多數情況下,退出JVM並終止進程是彼此同義的。你能提供一些關於你的病例究竟發生了什麼的細節(或者至少是什麼症狀)? – NPE 2012-02-01 17:14:18

+0

'Runtime.addShutdownHook'並做任何你有的 – bestsss 2012-02-01 18:12:23

回答

1

在退出之前,您應該在每個Process上調用.waitFor()方法。

如果你無法控制這一過程,以及你願意,你可以使用Runtime.addShutdownHook()

final Process process = startNewProcess(); 
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    @Override 
    public void run() { 
     process.waitFor(); 
    } 
})); 

我真的不推薦後者解決方案,如果可能的話,雖然。如果JVM沒有機會清理自己,那麼如果被強行殺死的話,這個過程仍然會運行。

+0

所以'waitFor()'會殺死JVM退出進程?我已經運行'waitFor()',但可能由於IO而未被調用。我會調查。 – 2012-02-01 17:42:49

+0

'waitFor()'會阻塞正在運行的線程,直到進程結束。我說你應該把它放在正常流程的末尾。否則,你可以使用我的替代方案。 – 2012-02-01 17:46:40

+0

是否可以向該進程發送信號,如Ctrl + C? – 2012-02-01 19:53:28

0

您可以保留所有正在運行的進程的列表,然後使用Process.destroy()將其關閉,如提到的Platinum Azure之類的關閉鉤子。

當進程完成時,您還需要清理清單。如果你有已經調用process.waitFor()的代碼,那麼可以清理列表。

銷燬方法強行關閉進程,可能會破壞正在執行的任何操作,因此您應該注意使用它。

如果你控制其他進程,然後發信號通知它關閉,然後等待它完成將是明智的通過銷燬。

相關問題