Java Runtime :: exec 메소드를 통해 Windows 배치 파일을 실행하고 싶습니다. 내 배치 파일 내에서 Java 프로그램을 실행하기 위해 다른 배치 파일을 실행합니다. 이 첫 번째 배치 파일은 "start"를 사용하여 두 번째 배치 파일을 실행합니다.Process Runtime Exec을 사용하여 "Start"로 배치 파일 실행
첫 번째 배치 파일이 완료 될 때까지 대기하고 두 번째 배치 파일은 신경 쓰지 않을 때까지 Runtime :: exec을 호출하는 메인 스레드를 원한다. Process :: getInputStream()과 Process :: getErrorStream()을 2 개의 개별 스레드에서 모두 소비하고 있습니다. 내 메인 스레드 (Runtime :: exec를 실행하는 스레드)는 2 스트림을 소비하는 스레드가 끝날 때까지 기다렸다가 계속하기 전에 기다린다.
그러나 첫 번째 배치 파일 실행이 끝난 후에도 내 스트림 소비 스레드가 계속 읽기 때문에 두 번째 배치 파일이 완료 될 때까지 내 메인 스레드가 항상 차단된다는 사실을 발견했습니다. 두 번째 배치 파일의 출력 및 오류 스트림을 무시하도록하려면 어떻게합니까?
start "" batch2.bat
exit
이 batch2.bat에서, 내가 자바 프로그램을 실행
: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은 다음과 같습니다
이
내가 내 메인 스레드에서 첫 번째 배치 파일을 실행하는 방법입니다 (java.exe 또는 javaw.exe로 실행 해 보았습니다)javaw.exe -cp . MyProgram 1>outlog 2>errlog
요약하면, 주 스레드를 실행할 때 다음을 얻을 수 있습니다. e batch1.bat가 완료되면 반환 코드가 반환됩니다. waitFor()는 차단 해제하지만 "errorLogger.join()"및 "outputLogger.join()"때문에 batch2.bat 및 javaw.exe가 종료 될 때까지 주 스레드가 차단됩니다. batch2.bat에서 출력을 읽는 것에 관심이 없습니다. batch1.bat가 끝나면 내 주 스레드를 반환하는 방법은 무엇입니까?
사실, 제 코드는 batch1.bat가 완료된 후 waitFor 메소드에서 차단되지 않습니다. batch2.bat가 완료 될 때까지 "errorLogger.join()"및 "outputLogger.join()"에서 블로킹됩니다. – yoroshiku
batch1.bat에서'start cmd/c batch2.bat'을 시도하십시오. 또한,'ErrorLogger.join()'에서 코드 블록을 처리 할 때) 마지막 실행에서 로그에이 행''반환 코드 ""가 있습니까? – abhinav
고마워, 나는'start cmd/c batch2.bat'을 시도했지만 같은 결과를 얻었다; 내 로그는 batch1이 완료된 후에''돌아온 코드를 얻는다 ''를 보여주고, batch2가 끝날 때까지 errorLogger.join()에서 내 코드가 여전히 블록된다. – yoroshiku