在 Java 中终止进程的最佳方法是什么?
获取 PID,然后用 Runtime.exec()
杀死它?
使用 destroyForcibly()
?
这两种方法有什么区别,还有其他解决方案吗?
原文由 Kariamoss 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Java 中终止进程的最佳方法是什么?
获取 PID,然后用 Runtime.exec()
杀死它?
使用 destroyForcibly()
?
这两种方法有什么区别,还有其他解决方案吗?
原文由 Kariamoss 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您试图终止您的 Java 代码启动的主进程,我建议您使用 System.exit()
。这里解释一下好处: 我们什么时候应该在java中调用系统退出。
本质上, System.exit()
将运行关闭挂钩,以确保在您的进程被杀死之前,任何可能尚未完成其工作的相关非守护进程被杀死。这是做到这一点的干净方法。
如果该进程不是您的,您将不得不依赖操作系统为您完成这项工作,如以下答案中所述: 使用 Java 杀死进程
在那种情况下,您建议 Runtime.exec()
在 *nix 上杀人将是一个不错的方法。
现在至于 destroyForcibly()
,您通常会在由您的 Java 代码生成的子进程上调用它,该代码可能是从进程 api 的 ProcessBuilder.start()
或 Runtime.exec()
的 ---
原文由 nlloyd 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
如果您要终止的进程已由您的应用程序启动
那么您可能有对它的引用(
ProcessBuilder.start()
或Runtime.exec()
都返回一个引用)。在这种情况下,您可以简单地调用p.destroy()
。我认为这是最干净的方法(但要小心:由p
启动的子进程可能仍然存在,检查 Process.destroy does not kill multiple child processes 以获取更多信息)。destroyForcibly
仅应在destroy()
在特定超时后失败时使用。简而言之destroy()
destroyForcibly()
杀死它—如果进程还活着如果你想杀死的进程是外部的
那么你别无选择:你需要通过 OS API (
Runtime.exec
)。在 Windows 上,要调用的程序是taskkill.exe
,而在 Mac 和 Linux 上你可以尝试kill
。查看 Java 8 对 Process.destroyForcibly() 和 .isAlive() 的支持以及 使用 Java 终止进程和编写 一个简单的 Java 应用程序以在指定时间后终止任何进程以 获取更多信息。