首页 > 解决方案 > 如何让进程等待

问题描述

我有一个执行外部程序的代码。现在我需要我的应用程序等待该外部程序的执行结束。

但我不知道我应该怎么做。我尝试了一些东西,但没有用。

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 但外部程序仍在运行。

标签: javaruntimeexternal

解决方案


您正在运行 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");

在上述两种情况下,您可能会遇到命令冻结的第二个问题,这是因为您没有读取标准输出和错误流。有很多关于如何做到这一点的帖子。


推荐阅读