Как приостановить процесс с помощью waitFor () - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь запустить скрипт Matlab из командной строки, которую я в свою очередь вызываю из Java.Я вызываю сценарий несколько раз, используя цикл, и на каждой итерации я хочу, чтобы моя Java-программа приостанавливалась до тех пор, пока сценарий Matlab не завершится и Matlab не будет завершен.

Использование в этом примере (который работаетв качестве шаблона, я придумал следующий код (упрощенно): РЕДАКТИРОВАТЬ: добавлено потребление входного потока и потока ошибок

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, как и ожидалось.

Что мне здесь не хватает?

ОБНОВЛЕНИЕ: Я только что узнал, что если я заменю notepad.exe на matlab.exe в примере игрушка , он больше не будет работать - Java завершится даже перед открытием Matlab.

1 Ответ

0 голосов
/ 24 декабря 2018

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 Без заставки и других параметров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...