非阻塞PipedStreams?

时间:2011-10-12 07:44:32

标签: java multithreading io blocking

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

到目前为止,这么好。我从这个范例中看到的一个潜在好处是,零散的生产者(OutputStream)不需要被缓慢的消费者(InputStream)放慢速度。换句话说,当OutputStream突然产生消费者无法立即消费的大量数据时,OutputStream不需要等待生成的数据被完全消耗在继续生活之前。

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

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

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

通过在等待新空间分配更大缓冲区的完全bufferes的情况下改变行为,似乎很容易解决这个问题。我可以在几分钟内实现一个,但是如果那里有类似的东西,我不想重新发明轮子。我搜索了很多,但是找不到任何东西,这对我来说非常令人惊讶。

有人能指出我正确的方向吗?或者指出我的想法在哪里错了?

由于

2 个答案:

答案 0 :(得分:3)

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

  

“管道输入流包含缓冲区,解耦读取操作   来自写作操作,在限制范围内。“

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

答案 1 :(得分:0)

我认为PipedOutputStream没有关于缓冲输出的任何保证,直到PipedInputStream准备就绪。所以,答案是否定的,尽管在实践中你可能会注意到一些缓冲。

编辑:尝试搜索术语“循环缓冲区”。不知道有一个副手,但这是这类案件的通用名称。