Java中杀死进程的正确方法

新手上路,请多包涵

在 Java 中终止进程的最佳方法是什么?

获取 PID,然后用 Runtime.exec() 杀死它?

使用 destroyForcibly()

这两种方法有什么区别,还有其他解决方案吗?

原文由 Kariamoss 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
2 个回答

如果您要终止的进程已由您的应用程序启动

那么您可能有对它的引用( ProcessBuilder.start()Runtime.exec() 都返回一个引用)。在这种情况下,您可以简单地调用 p.destroy() 。我认为这是最干净的方法(但要小心:由 p 启动的子进程可能仍然存在,检查 Process.destroy does not kill multiple child processes 以获取更多信息)。

destroyForcibly 仅应在 destroy() 在特定超时后失败时使用。简而言之

  1. 终止进程 destroy()
  2. 允许进程以合理的超时优雅退出
  3. destroyForcibly() 杀死它—如果进程还活着

如果你想杀死的进程是外部的

那么你别无选择:你需要通过 OS API ( Runtime.exec )。在 Windows 上,要调用的程序是 taskkill.exe ,而在 Mac 和 Linux 上你可以尝试 kill


查看 Java 8 对 Process.destroyForcibly() 和 .isAlive() 的支持以及 使用 Java 终止进程和编写 一个简单的 Java 应用程序以在指定时间后终止任何进程以 获取更多信息。

原文由 Derlin 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题