簡體   English   中英

非阻塞PipedStreams?

[英]Non-blocking PipedStreams?

PipedInputStreamPipedOutputStream用於線程間數據傳輸。 “一個線程從PipedInputStream對象讀取數據,而另一個線程將數據寫入相應的PipedOutputStream ”。

到現在為止還挺好。 我從該范例中看到的一個潛在好處是,不需要由緩慢的使用者( InputStream )來降低零星的生成器( OutputStream )的速度。 換句話說,在OutputStream突然產生大量數據而使消費者無法立即使用的數據時, OutputStream無需等待所產生的數據被完全消耗就可以繼續使用。

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

如果對問題1的回答為“是”,則:

當緩沖區未滿時,這很好用,但是當緩沖區已滿時,在JDK6的實現中,PipedOutputStream會阻塞並等待更多空間釋放。 這超出了我上面提到的目的,不是嗎?

通過更改完整緩沖區的行為,從等待新空間到分配更大的緩沖區,似乎很容易解決該問題。 我可能會在幾分鍾內實施一個,但是如果這樣的東西已經可以使用了,我就不想重新發明輪子。 我在谷歌上搜索了很多,但是卻找不到任何東西,這對我來說非常令人驚訝。

有人能指出我正確的方向嗎? 還是指出我的想法有誤?

謝謝

PipedOutputStream並不是真正打算以這種方式緩沖結果(緩沖在其實現中更多是副作用)。 正如Javadoc所說:

“管道輸入流包含一個緩沖區, 在限制范圍內將讀取操作與寫入操作分離。”

為了按照您描述的方式進行緩沖,我傾向於使用http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

我不認為PipedOutputStream有任何保證在PipedInputStream准備好之前緩沖輸出。 因此,答案是否定的,盡管實際上您可能會注意到一些緩沖。

編輯:嘗試搜索術語“圓形緩沖區”。 暫時不知道一個人,但這是這種情況的通用名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM