Я бы хотел запустить пакетный файл 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?