2011-10-12 138 views
1

PipedInputStreamPipedOutputStream用於線程間數據傳輸。 「通過一個線程從PipedInputStream對象中讀取數據,並通過其他線程將數據寫入相應的PipedOutputStream」。非阻塞的PipedStreams?

到目前爲止,這麼好。我從這個範例中看到的一個潛在的好處是零星生產者(OutputStream)不需要被慢速消費者放慢(InputStream)。換句話說,在OutputStream突然產生大量消費者無法立即消費的數據的時候,OutputStream不需要等待生成的數據在完成其生命之前完全消耗。

問題1:我的理解是否正確?這是PipedStreams結構的好處之一嗎?

如果回答問題1是肯定的,那麼:

這種運作良好,當緩衝區未滿,但是當緩衝區已滿,在JDK6的實施中,的PipedOutputStream塊,並等待更多的空間來自由向上。這打破了我上面提到的目的,不是嗎?

這個問題似乎很容易通過改變完整緩衝區等待新空間分配更大緩衝區的行爲來解決。我可以在幾分鐘內實現一個,但如果這樣的東西已經可用,我不想重新發明輪子。我搜索了很多,但是找不到任何東西,這對我來說是非常令人驚訝的。

有人能指點我正確的方向嗎?或者指出我的想法在哪裏?

感謝

回答

0

我不認爲擁有的PipedOutputStream約,直到PipedInputStream的準備緩衝輸出的任何guarentees。所以,答案是否定的,儘管在實踐中你可能會注意到一些緩衝。

編輯:嘗試搜索術語「循環緩衝區」。不知道一個人是誰,但這是這種情況的通用名稱。

+0

不詢問保證。只是說緩衝區大小可調是一個簡單而有用的改進,我想知道爲什麼沒有人寫過一個並使其可用。 – RAY

3

PipedOutputStream實際上並不是要以這種方式緩衝結果(緩衝更多的是它的實現中的副作用)。正如Javadoc中說:

「的管道輸入流中包含的緩衝器,限制內去耦讀取操作從寫入操作 ,」。

對於你描述的緩衝方式,我傾向於使用http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

+0

謝謝。 Upvoted。我想我的問題完全是針對聲明中的「wihtin極限」部分。在我看來,讓它「無限制」非常容易,我想知道爲什麼它沒有完成。 是的,LinkedBlockingQueue正是我所說的那種數據結構。我想知道爲什麼沒有使PipedInputStreamBuffer像LinkedBlockingQueue那樣的實現。 雖然我會爲字節編寫LinkedBlockQueue的自定義版本,但由於自動裝箱/拆箱而直接使用LinkedBlockingQueue效率不高 – RAY

+0

我已經完成了一個類似的事情(一個BackgroundInputStream),它使用了一個BlockingQueue。不過,我將字節**數組**添加到隊列中,而不是單個字節。這樣你就不必編寫自己的BlockingQueue。 –