杀死一个java.lang.Process而不是杀死subprocess()



我有一个有很多按钮的GUI。每个按钮创建一个Process(ProcessBuilder.start()),发送带有预设参数的预定ClearCase命令。

调用ProcessBuilder.start()后,我将进程添加到列表中。当程序关闭时,我会循环访问此列表并在每个进程上调用destroy()。我正在使用Runtime.getRuntime().addShutdownHook()来尝试遍历我的列表。

但是,当我查看Windows任务管理器时,我看到一些conhost.execleartool.exe进程仍然处于活动状态。我怀疑Process.destroy()要么不起作用,要么没有传播。有没有办法在用户单击 X 时完全清理程序并杀死所有子进程?

使用Java 9,可以终止主进程引用的子进程。

LOGGER.info("Going to stop the process descendants (subprocesses) {}", this.process.descendants().collect(Collectors.toList()));
process.descendants().forEach((ProcessHandle d) -> {
d.destroy();
});
LOGGER.info("Going to stop the process {}", this.process);
process.destroy();

请参阅: 使用 Java 终止进程

但请注意,如果您调用的进程创建新的子流程,则可能不会终止这些子流程(请参阅 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092)。

相关内容

  • 没有找到相关文章

最新更新