如何使用waitFor()暂停进程

时间:2018-12-24 00:50:28

标签: 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之前就终止了。

1 个答案:

答案 0 :(得分:2)

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 没有启动画面和其他选项