我正在编写一个应用程序,涉及将大量数据写入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();
}
}
}
}
这种设计的问题在于,随着越来越多的写操作发生,越来越多的数据排队等待写入,但写入速度并没有变快。最初,当数据放入队列时,它几乎立即被写入。然后大约15秒左右之后,数据开始滞后;从数据排队到实际写入的时间会有一定的延迟。随着时间的推移,这种延迟变得越来越长。这是非常明显的。
修复这个问题的方法是使用某种ConcurrentOutputStream实现,使数据能够无需阻塞地发送,从而避免写操作被堵塞(甚至可以不用队列)。我不知道是否有这样的实现 - 我一直无法找到 - 而且我个人认为这是不可能实现的。
那么,有人有什么建议可以重新设计这个吗?