Использование Process Runtime Exec для запуска командного файла с помощью «Пуск» - PullRequest
0 голосов
/ 03 ноября 2011

Я бы хотел запустить пакетный файл Windows с помощью метода Java Runtime :: exec.Внутри моего командного файла я запускаю другой командный файл для запуска Java-программы.Этот первый пакетный файл использует «start» для выполнения второго пакетного файла.

Я хочу, чтобы мой основной поток, который вызывает Runtime :: exec, ожидал ТОЛЬКО до завершения первого пакетного файла, но не заботился о втором пакетном файле.Я потребляю все из Process :: getInputStream () и Process :: getErrorStream (), в 2 отдельных потока.Мой основной поток (тот, который выполняет Runtime :: exec) ждет завершения потоков, потребляющих 2 потока, прежде чем продолжить.

Однако я обнаружил, что мой основной поток всегда блокируется до завершения второго пакетного файла,потому что даже после завершения выполнения первого пакетного файла мои потоки, потребляющие поток, продолжают читать.Как мне заставить их игнорировать выходные данные и потоки ошибок из 2-го пакетного файла?

Вот как я выполняю первый пакетный файл в моем основном потоке:

Runtime runtime = Runtime.getRuntime();
String[] cmd = new String[]{"cmd.exe", "/C", "batch1.bat"};
Process proc = runtime.exec(cmd);
StreamLogger errorLogger = new StreamLogger(proc.getErrorStream()); // consume
StreamLogger outputLogger = new StreamLogger(proc.getInputStream()); // consume
errorLogger.start(); // start reading the error stream in another thread
outputLogger.start(); // start reading the output stream in another thread
returnCode = proc.waitFor();
log.debug("Obtained return code");
errorLogger.join();
outputLogger.join();
log.debug("Finished reading from streams");

batch1.bat выглядит следующим образом:

start "" batch2.bat
exit

В batch2.bat я запускаю Java-программу (я пытался запустить ее как с java.exe, так и с javaw.exe)

javaw.exe -cp . MyProgram 1>outlog 2>errlog

InТаким образом, когда я запускаю свой основной поток, я могу получить код возврата после завершения batch1.bat (т. е. waitFor () разблокирует), но основной поток блокируется до тех пор, пока не завершатся batch2.bat и javaw.exe из-за "errorLogger.join () "и" outputLogger.join () ".Я не заинтересован в чтении вывода из batch2.bat;как заставить мой основной поток возвращаться после завершения batch1.bat?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Вы пытались вызвать второй пакет через start / b batch2.bat?

0 голосов
/ 03 ноября 2011

Это обязательно произойдет, если вы используете метод waitFor, если batch2.bat выполняется в том же процессе, что и batch1.bat.

Я бы сказал:у вас есть несколько вариантов (если вы действительно хотите дождаться завершения выполнения первого пакетного файла):

  1. Используйте сценарий, способный вызывать независимый процесс для batch2.bat.
  2. Отправьте на outputlogger маркер, который сообщает вашему родительскому процессу, что batch1.bat завершил выполнение и не использует waitFor.Это поможет вам продолжить работу с логикой кода.
...