如果你想终止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()启动的
5条答案
按热度按时间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 8、Killing a process using Java和Code a Simple Java App to Kill Any Process After a Specified Time。
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()
启动的h79rfbju3#
对我有用的是System.exit(0);它运行良好,因为它关闭了所有仍在运行的进程和组件
lawou6xi4#
Java 9引入了公开.destroy()和.destroyForcibly()方法的ProcessHandle。
TL;DR:
如果您知道进程ID(pid),则使用."of”:
否则,请执行以下步骤:
1.使用ProcessHandle.allProcesses()列出所有当前正在运行的进程
1.使用.info()检查它们
1.使用上述
destroy
方法之一。eqzww0vc5#
Java 8源代码
我只想说
destroyForcibly
等于Java 8中的destroy
。所以如果在调用
destroy
方法后进程还活着,你应该尝试用pid杀死进程。如果你是在java 9+上,你可以很容易地得到pid,只要调用Process.pid()
方法。