2016-02-05 50 views
9

在Java中殺死進程的最佳方式是什麼?在Java中殺死進程的正確方法

獲取PID,然後用Runtime.exec()將其殺死?

使用destroyForcibly()

這兩種方法有什麼區別,還有其他解決方法嗎?

+1

這是你自己的進程或其他進程? –

+0

它是一個java進程或任何進程? – Derlin

+0

這是一個外部非Java過程,但感謝Shitsu – Kariamoss

回答

9

如果要終止的進程已經被你的應用程序

開始,那麼你可能需要它(ProcessBuilder.start()Runtime.exec()都返回的引用)的引用。在這種情況下,您可以簡單地致電p.destroy()。我認爲這是最乾淨的方式(但要小心:由p開始的子流程可以保持活着,請查詢http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092瞭解更多信息)。

僅當destroy()在特定超時後失敗時才應使用destroyForcibly。簡而言之

  1. 終止進程與destroy()
  2. 允許進程與合理的超時正常退出
  3. destroyForcibly()殺死它,如果過程是 還活着

如果進程你想殺的就是外部

然後你沒有太多的選擇:你需要通過OS API(Runtime.exec)。在Windows上,要調用的程序將是taskkill.exe,而在Mac和Linux上,您可以嘗試kill


看一看https://github.com/zeroturnaround/zt-exec/issues/19Killing a process using Javahttp://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/獲取更多信息。

+0

謝謝你的解釋!這絕對是我正在尋找的 – Kariamoss

4

如果你想殺死你的java代碼的主流程,我建議使用System.exit()。好處在這裏解釋:when should we call system exit in java

實質上,System.exit()將運行關閉掛鉤,以確保在進程終止之前可能沒有完成其工作的所有依賴的非守護進程都被終止。這是乾淨的方式。

如果這個過程是不是你的,你將不得不依賴於操作系統,這樣做對你的工作在這個答案解釋:Killing a Process Using Java

在這種情況下,您的建議Runtime.exec()在* nix擊殺會是一個體面的路要走。

現在爲destroyForcibly(),你通常會調用由Java代碼催生了一個子進程大概是開始與進程API的ProcessBuilder.start()Runtime.exec()