并行写入标准OutputStream

Mar*_*ius 6 java sockets queue outputstream

我正在编写一个应用程序,它涉及将相当大的数据块写入OutputStream(属于Socket).使这有点复杂的是,通常有多个线程试图写入同一个OutputStream.目前,我设计它使得要写入数据的OutputStream在它自己的线程中.该线程包含一个队列(LinkedList),它轮询字节数组并尽快写入它们.

private class OutputStreamWriter implements Runnable {

    private final LinkedList<byte[]> chunkQueue = new LinkedList<byte[]>();

    public void run() {
        OutputStream outputStream = User.this.outputStream;
        while (true) {
            try {
                if (chunkQueue.isEmpty()) {
                    Thread.sleep(100);
                    continue;
                }
                outputStream.write(chunkQueue.poll());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这种设计的问题在于,随着越来越多的写入发生,越来越多的数据排队,并且不会更快地写入.最初,当数据被放入队列时,它几乎立即被写入.然后大约15秒后,数据开始落后; 从数据排队的时间到实际写入数据的时间延迟.随着时间的推移,这种延迟变得越来越长.这是非常明显的.

解决这个问题的一种方法是使用某种ConcurrentOutputStream实现,它允许在不阻塞的情况下发送数据,这样就不会开始备份写入(哎呀,队列就没必要了).我不知道是否有这样的实现 - 我一直找不到 - 我个人认为甚至不可能写一个.

那么,有没有人对我如何重新设计这个有什么建议?

irr*_*ble 4

套接字的吞吐量是有限的;如果它比数据生成吞吐量慢,则必须缓冲数据,这是没有办法解决的。“同时”写入根本没有帮助。

当排队数据超过一定限制时,您可以考虑暂停数据生成,以减少内存消耗。