2011-09-04 28 views
2

我得到了非常普遍朝不保夕狀態,雖然我不明白爲什麼會發生。 我有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

謝謝

回答

0

其實這個緩衝讀寫錯誤流不再存在, 因爲外部流程結束

你猜,這是因爲您已發送的退出命令發送到外部流程的情況下,還是你真的檢查過兩種情況?

由於BufferedReader.readLine()將不再阻止,但返回null一旦插座關閉,我不認爲套接字已關閉...

+0

WAITFOR()外部進程返回,我以爲,按照規範該外部進程終止。 spec說:「waitFor()會導致當前線程在必要時等待,直到此Process對象表示的進程已終止。如果子進程已終止,此方法立即返回。如果子進程還沒有終止,調用線程將被阻塞,直到子進程退出。「 – d3ni5

+0

所以我同意你,如果外部終止 - errorStream應該關閉 - 在readLine中沒有掛起。 如果我看到掛在readLine我懷疑它是由oracle包裝引起的(這個java代碼是存儲在oracle中的java函數)還是涉及到一些bug – d3ni5

+0

你是什麼意思,「它被包裝在oracle中」和「這個java代碼是存儲在oracle中?Java函數「 – DaveFar