【发布时间】:2012-11-01 14:14:49
【问题描述】:
我正在编写一个应用程序,该应用程序涉及将大量数据写入 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 实现,它允许在不阻塞的情况下发送数据,这样就不会开始备份写入(哎呀,那时就不需要队列了)。我不知道是否有这样的实现——我一直找不到——而且我个人认为甚至不可能写一个。
那么,有人对我如何重新设计这个有什么建议吗?
【问题讨论】:
-
这不是很有建设性。它有什么问题?
-
顺便说一句,您是否正在同步对链表的修改?因为它在设计上不是线程安全的。另外,你在套接字输出之上分层了什么样的输出流,你通过它推送了多少数据?
标签: java sockets queue outputstream