在Java中终止进程的正确方法

5q4ezhmt  于 2022-12-28  发布在  Java
关注(0)|答案(5)|浏览(827)

在Java中终止进程的最佳方法是什么?
获取PID,然后用Runtime.exec()杀死它?
是否使用destroyForcibly()
这两种方法有什么区别,还有其他的解决办法吗?

5ssjco0h

5ssjco0h1#

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

那么你可能有一个对它的引用(ProcessBuilder.start()Runtime.exec()都返回一个引用),在这种情况下,你可以简单地调用p.destroy(),我认为这是最干净的方式(但是要小心:由p启动的子进程可以保持活动,检查Process.destroy does not kill multiple child processes以获得更多信息)。
destroyForcibly应该仅在destroy()在某个超时后失败时使用。
1.使用destroy()终止进程
1.允许进程在合理的超时时间内正常退出
1.如果进程仍在运行,则使用destroyForcibly()终止它

如果要终止的进程是外部进程

那你就别无选择了你需要通过OS API(Runtime.exec)。在Windows上,要调用的程序将是taskkill.exe,而在Mac和Linux上你可以尝试kill
有关更多信息,请查看Support for Process.destroyForcibly() and .isAlive() from Java 8Killing a process using JavaCode a Simple Java App to Kill Any Process After a Specified Time

ds97pgxw

ds97pgxw2#

如果你想终止java代码启动的主进程,我建议你使用System.exit(),它的好处如下:when should we call system exit in java.
本质上,System.exit()会运行shutdown钩子,确保在你的进程被杀死之前,任何可能还没有完成工作的非守护进程都被杀死。
如果进程不是您的,您将不得不依靠操作系统来为您完成此工作,如以下答案所述:Killing a Process Using Java
在这种情况下,你的建议Runtime.exec()杀死 * nix将是一个体面的方式去。
现在,对于destroyForcibly(),您通常将在由Java代码生成的子进程上调用它,该子进程可能是用进程api的ProcessBuilder.start()Runtime.exec()启动的

h79rfbju

h79rfbju3#

对我有用的是System.exit(0);它运行良好,因为它关闭了所有仍在运行的进程和组件

lawou6xi

lawou6xi4#

Java 9引入了公开.destroy()和.destroyForcibly()方法的ProcessHandle

TL;DR

如果您知道进程ID(pid),则使用."of”:

ProcessHandle.of(pid).destroy();

否则,请执行以下步骤:
1.使用ProcessHandle.allProcesses()列出所有当前正在运行的进程
1.使用.info()检查它们
1.使用上述destroy方法之一。

eqzww0vc

eqzww0vc5#

Java 8源代码

public Process destroyForcibly() {
    destroy();
    return this;
}

我只想说destroyForcibly等于Java 8中的destroy
所以如果在调用destroy方法后进程还活着,你应该尝试用pid杀死进程。如果你是在java 9+上,你可以很容易地得到pid,只要调用Process.pid()方法。

相关问题