java - 如何使用 waitFor() 暂停进程

标签 java process

我正在尝试从命令行运行 Matlab 脚本,而我又从 Java 调用该脚本。我使用循环多次调用该脚本,并且在每次迭代中我希望我的 Java 程序暂停,直到 Matlab 脚本结束并退出 Matlab。

使用this example (效果很好)作为模板,我想出了以下代码(简化): 编辑:增加了输入流和错误流的消耗

Runtime rt = Runtime.getRuntime();
String cmd = "matlab -r \"my_matlab_cmd(arg1, arg2); exit\"";

try {
    Process proc = rt.exec(cmd);
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String line = null;
    while((line = stdInput.readLine()) != null) {
        System.out.println(line);
    }
    BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
    StringBuilder err = new StringBuilder();
    String e = null;
    while ((e = stdError.readLine()) != null) {
       err.append(e + "\n");
    }
    if (err.length() != 0) {
        throw new IOException(err.toString());
    }
    int pwf = proc.waitFor();
    System.out.println(pwf);
} catch (IOException e1) {
    e1.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("Matlab finished");

但是,这并不符合预期。 Java 不会等待 Matlab 完成其工作并关闭;相反,它直接进入最终的打印输出命令。没有错误,pwf 的值为 0,正如预期的那样。

我在这里缺少什么?

更新:我刚刚发现,如果我将 toy example 中的 notepad.exe 替换为 matlab.exe ,它不再工作了 - Java 甚至在 Matlab 打开之前就终止了。

最佳答案

Matlab 还需要 -wait 参数才能不立即返回: https://www.mathworks.com/matlabcentral/answers/320908-how-to-start-matlab-from-command-prompt-and-wait-for-the-application-to-return

据我了解,matlab 启动脚本,您可以将其作为子进程传递,因此主 matlab 命令在启动子进程后立即终止,除非您另有说明

另请参阅:https://www.mathworks.com/help/matlab/ref/matlabwindows.html 对于无闪屏和其他选项

关于java - 如何使用 waitFor() 暂停进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53908264/

相关文章:

java - 使用 Apache Maven 在 IntelliJ 中构建 Java 项目的内存问题,发生在 Java 7 中,使用 Java 8 构建良好

java - JMeter 尝试在请求中使用 EOF

python - 有没有办法用python获取本地机器的进程信息?

sql - Sql Server事件监视器中的这个进程是什么?

python - 从已经运行的进程创建子进程对象

java - 当父类中的 protected (或抽象)方法被删除并且子类已实现它时,如何导致编译错误/警告

java - glassfish 每小时一次完整GC

java - 在 Java 中查看视锥体剔除盒子

java - 在 Java 中启动进程后如何退出 while 循环?

c++ - 当前进程的 DLL