【问题标题】:Non-blocking PipedStreams?非阻塞管道流?
【发布时间】:2011-12-05 21:52:40
【问题描述】:

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

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

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

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

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

通过将缓冲区满的情况下的行为从等待新空间更改为分配更大的缓冲区,这个问题似乎很容易解决。我可能可以在几分钟内实现一个,但如果那里已经有类似的东西,我不想重新发明轮子。我用谷歌搜索了很多,但找不到任何东西,这让我很惊讶。

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

谢谢

【问题讨论】:

    标签: java multithreading io blocking


    【解决方案1】:

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

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

    【讨论】:

    • 不询问保证。只是说使缓冲区大小可调似乎是一种简单而有用的改进,我想知道为什么没有人写过一个并使其可用。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。赞成。我想我的问题正是针对声明的“限制”部分。在我看来,让它“无限制”非常容易,我想知道为什么它没有完成。是的,LinkedBlockingQueue 正是我所说的那种数据结构。我想知道为什么在某个地方没有实现使 PipedInputStreamBuffer 像 LinkedBlockingQueue。我会为字节编写一个自定义版本的 LinkedBlockQueue,但由于自动装箱/拆箱,直接使用 LinkedBlockingQueue 效率不高
    • 我做了一个类似的事情(一个BackgroundInputStream),它使用了一个BlockingQueue。但是,我将字节 arrays 添加到队列中,而不是单个字节。这样您就不必编写自己的 BlockingQueue。
    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2010-12-16
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多