從PipedInputStream讀取數據時,如果符合下面三個條件,就會出現IOException異常:
1. 試圖從PipedInputStream讀取數據,
2. PipedInputStream的緩沖區為“空”(即不存在可讀取的數據),
3. 最后一個向PipedOutputStream寫數據的線程不再活動(通過Thread.isAlive()檢測)。
這是一個很微妙的時刻,同時也是一個極其重要的時刻。假定有一個線程w向PipedOutputStream寫入數據;另一個線程r從對應的 PipedInputStream讀取數據。下面一系列的事件將導致r線程在試圖讀取PipedInputStream時遇到IOException異常:
1. w向PipedOutputStream寫入數據。
2. w結束(w.isAlive()返回false)。
3. r從PipedInputStream讀取w寫入的數據,清空PipedInputStream的緩沖區。
4. r試圖再次從PipedInputStream讀取數據。這時PipedInputStream的緩沖區已經為空,而且w已經結束,從而導致在讀操作執行時出現IOException異常。
構造一個程序示范這個問題并不困難,只需從Listing 3的startWriterThread()方法中,刪除while(true)條件。這個改動阻止了執行寫操作的方法循環執行,使得執行寫操作的方法在一次寫入操作之后就結束運行。如前所述,此時主線程試圖讀取PipedInputStraem時,就會遇到一個IOException異常。
文章來源于領測軟件測試網 http://www.kjueaiud.com/