java - 如何让进程等待
问题描述
我有一个执行外部程序的代码。现在我需要我的应用程序等待该外部程序的执行结束。
但我不知道我应该怎么做。我尝试了一些东西,但没有用。
public Image acquireImage() throws IOException, InterruptedException {
process = Runtime.getRuntime().exec("cmd.exe /c start "+ApplicationProperties.getPath()
+ "\\.wimdesktop\\Release\\Static_GenerateGain.exe");
process.waitFor();
System.out.println("EXIT: " + process.exitValue());
return copyImage();
}
问题是System.out.println("EXIT: " + process.exitValue());
打印 0 但外部程序仍在运行。
解决方案
您正在运行 cmd.exe 并要求它在后台启动一个进程。因此,您所看到的只是 cmd.exe 在启动您的应用程序后退出状态为 0 - 而且该应用程序可能仍在运行。
如果您希望 waitFor 应用于子进程,只需直接运行 exe 而无需启动包装器:
process = Runtime.getRuntime().exec(ApplicationProperties.getPath()
+ "\\.wimdesktop\\Release\\Static_GenerateGain.exe");
请注意,如果您的 EXE 依赖于由 CMD.EXE 设置的环境变量,那么您可能需要尝试您的原始命令,而无需“启动”后台进程:
process = Runtime.getRuntime().exec("cmd.exe /c "+ApplicationProperties.getPath()
+ "\\.wimdesktop\\Release\\Static_GenerateGain.exe");
在上述两种情况下,您可能会遇到命令冻结的第二个问题,这是因为您没有读取标准输出和错误流。有很多关于如何做到这一点的帖子。
推荐阅读
- python - median is not working on a list in python
- c++ - 如何将“.bc”库中的符号(即:来自 emar archiver builder 的 .a 后缀)导出到 javascript?
- java - 我的 ViewModel 无法在配置更改后继续存在
- c# - C# / ASP.NET Core 的 ExpressJS 等价物是什么?
- sql-server - 在 varbinary 中设置位
- python-3.x - twilio:检测到拨号目标正忙?
- c++ - 在 Ubuntu 16.04 中设置 libjpeg 环境变量
- c++ - 将 sqlite 数据库中的图像显示到 QTableView 中的列
- java - 如何从存储库类房间数据库中的实时数据中获取值
- java - 安装多个后端映像的 docker 错误