2011-09-04 3 views
2

왜 그런지는 이해할 수 없지만 매우 일반적인 스레드 정지 조건이 있습니다. 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

답변

0

, 는 당신이 외부 프로세스에 종료 명령을 전송했기 때문에 이런 경우가 생각합니까

를 완료 , 아니면 두 경우 모두 실제로 확인 했습니까? 외부 프로세스에 대한

BufferedReader.readLine()가 더 이상 차단 없지만 소켓, 나는 소켓이 닫혀 있다고 생각하지 않습니다 종료 후에는 null를 돌려줍니다 때문에 ...

+0

WAITFOR는() 반환과 나는 사양에 따라 맡기 외부 프로세스가 종료되었습니다. spec : "waitFor()는이 Process 객체가 나타내는 프로세스가 종료 될 때까지 현재 스레드가 대기 할 때까지 기다립니다.이 프로세스는 하위 프로세스가 이미 종료 된 경우 즉시 반환됩니다.하위 프로세스가 아직 종료되지 않은 경우 하위 프로세스가 종료 될 때까지 호출 스레드가 차단됩니다. " – d3ni5

+0

외부 종료가있는 경우 - errorStream이 닫혀 있어야합니다 - readLine이 중단되지 않음에 동의합니다. readLine 여기 오라간 잘못 가고있어. 오라클 래퍼 (이 자바 코드는 오라클 자바 함수가 저장되어있다) 또는 일부 버그가 포함 된 것으로 의심된다. ​​ – d3ni5

+0

"오라클에 랩핑되어있다"는 것과 "이 자바 코드는 오라클에 저장되어있다. ? 자바 기능 " – DaveFar