我得到了非常普遍朝不保夕狀態,雖然我不明白爲什麼會發生。 我有2個線程:main()和errorStreamReaderThread的java:的Runtime.exec()線程和ERROROUTPUT,的readLine
在主線程:
- 通過的Runtime.exec()執行外部過程
- 創建新errorStreamReaderThread消耗錯誤輸出流
- 執行操作外部過程的輸入和輸出流(執行命令和讀命令的輸出)
- 發送退出命令到外部進程
- WAITFOR(),用於外部p - 爲errorStreamReaderThread
設置中斷標誌rocess終止
- 外部過程
的返回RC在errorStreamReaderThread:!
- 對錯誤流執行緩衝的readLine而interruptedFlag & &(線= br.readLine())= NULL( errorStream是從主要外部進程)
傳遞 - 執行日誌錯誤流
我預計,即使的readLine()在流中阻塞 - 只要此流的發起者完成(本例中爲外部流程),應該中斷此readLine。
觀察到的行爲 - 一切正常95%的時間 - 沒有掛起,兩個線程:主線程和錯誤線程完成並且程序完成。 - 約5%掛起 - 主線程完成(返回waitFor) - errorStreamReaderThread在BufferedReader.readLine上被阻塞(實際上由於外部過程完成,此緩衝讀取器的錯誤流不再存在)
其他環境因素是,該Java類爲甲骨文的Java功能(它被包裹在Oracle)
請讓我知道我在這裏失蹤執行,爲什麼我得到這個的readLine掛在非現有errorStream
謝謝
WAITFOR()外部進程返回,我以爲,按照規範該外部進程終止。 spec說:「waitFor()會導致當前線程在必要時等待,直到此Process對象表示的進程已終止。如果子進程已終止,此方法立即返回。如果子進程還沒有終止,調用線程將被阻塞,直到子進程退出。「 – d3ni5
所以我同意你,如果外部終止 - errorStream應該關閉 - 在readLine中沒有掛起。 如果我看到掛在readLine我懷疑它是由oracle包裝引起的(這個java代碼是存儲在oracle中的java函數)還是涉及到一些bug – d3ni5
你是什麼意思,「它被包裝在oracle中」和「這個java代碼是存儲在oracle中?Java函數「 – DaveFar