首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞PipedStreams?

非阻塞PipedStreams?
EN

Stack Overflow用户
提问于 2011-10-12 15:44:32
回答 2查看 792关注 0票数 1

PipedInputStreamPipedOutputStream用于线程间数据传输。“一个线程从PipedInputStream对象读取数据,另一个线程将数据写入相应的PipedOutputStream”。

到现在为止还好。我从这个范例中看到的一个潜在好处是,零星生产者(OutputStream)不需要被缓慢的消费者(InputStream)减慢。换句话说,当OutputStream突然产生大量用户无法立即使用的数据时,OutputStream不需要等待所产生的数据完全被使用后再继续使用。

问题1:我的理解正确吗?这是这个PipedStreams构造的好处之一吗?

如果问题1的答案是肯定的,那么:

这在缓冲区未满时工作得很好,但当缓冲区已满时,在JDK6的实现中,PipedOutputStream会阻塞并等待更多空间释放。这违反了我上面提到的目的,不是吗?

这个问题似乎很容易解决,只需将缓冲区已满的情况下的行为从等待新空间更改为分配更大的缓冲区。我可能可以在几分钟内实现一个,但如果已经有类似的东西可用,我会讨厌重新发明轮子。我在谷歌上搜索了很多,但没有找到,这对我来说是相当令人惊讶的。

谁能给我指个方向?或者指出我的想法错在哪里?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2011-10-12 16:57:29

PipedOutputStream实际上并不打算以这种方式缓冲结果(缓冲在其实现中更多的是一种副作用)。正如Javadoc所说:

“管道输入流包含一个缓冲区,将读操作与写操作解耦, input 。”

对于您所描述的缓冲方式,我倾向于使用http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

票数 3
EN

Stack Overflow用户

发布于 2011-10-12 16:14:49

在PipedInputStream准备好之前,我不认为PipedOutputStream有任何关于缓冲输出的保证。因此,答案是否定的,尽管在实践中您可能会注意到一些缓冲。

编辑:尝试搜索术语“循环缓冲区”。不知道有没有,但这是这类案件的常见名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7736775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档