왜 그런지는 이해할 수 없지만 매우 일반적인 스레드 정지 조건이 있습니다. I 2 개 스레드를 가지고 주 스레드 메인() 및 errorStreamReaderThreadjava : Runtime.exec() 스레드 및 errorOutput, readLine
:
- Runtime.exec의()를 통해 외부의 처리를 실행을
- 조작을 수행 - 에러 출력 스트림
소비 새로운 errorStreamReaderThread을 만들
- 외부 프로세스에 exit 명령 보내기
- errorStreamReaderThread에 대한 인터럽트 플래그 설정
- 외부 p에 대한 waitFor() - 외부 프로세스의 입력 및 출력 스트림에서 errorStreamReaderThread에서 외부 프로세스
의 복귀 RC - 로웠는
를 종료한다 !!
- 에러 스트림 버퍼 내의 readLine를 수행하면서 interruptedFlag & & (라인 = br.readLine()) = (NULL errorStream 메인에서 외부 프로세스)
에서 전달 - 실행 로그 오류 스트림
내가 기대 비록 내의 readLine() 블록 온 스트림 -이 스트림의 생성자가 종료되면 (이 경우 외부 프로세스)이 readLine을 중단해야합니다.
관찰 된 동작 - 모든 것이 95 %의 시간 동안 정상적으로 작동합니다. - 아무런 응답도없고 두 스레드 모두 : 메인 및 오류 스레드가 완료되고 프로그램이 끝납니다. - 그것은 중단에 대해 5 % - errorStreamReaderThread가 BufferedReader.readLine에 차단 (외부 프로세스가 완성 된 이후 실제로 버퍼링 독자에 대한 오류 스트림이 더 이상 존재)
- 메인 쓰레드는 (WAITFOR가 반환됩니다) 가 완료추가 환경 요인이 자바 클래스 (이 오라클에 싸여)
날 내가 여기에 누락 무엇인지 알려 주시기 바랍니다 오라클 자바 함수로 실행되는 것을 내가 가지고 왜 내의 readLine 비 기존 errorStream에 달려
고맙습니다.
외부 프로세스 이후 버퍼링 독자에 대한 오류 스트림이 더 이상 존재한다 사실 10
WAITFOR는() 반환과 나는 사양에 따라 맡기 외부 프로세스가 종료되었습니다. spec : "waitFor()는이 Process 객체가 나타내는 프로세스가 종료 될 때까지 현재 스레드가 대기 할 때까지 기다립니다.이 프로세스는 하위 프로세스가 이미 종료 된 경우 즉시 반환됩니다.하위 프로세스가 아직 종료되지 않은 경우 하위 프로세스가 종료 될 때까지 호출 스레드가 차단됩니다. " – d3ni5
외부 종료가있는 경우 - errorStream이 닫혀 있어야합니다 - readLine이 중단되지 않음에 동의합니다. readLine 여기 오라간 잘못 가고있어. 오라클 래퍼 (이 자바 코드는 오라클 자바 함수가 저장되어있다) 또는 일부 버그가 포함 된 것으로 의심된다. – d3ni5
"오라클에 랩핑되어있다"는 것과 "이 자바 코드는 오라클에 저장되어있다. ? 자바 기능 " – DaveFar