我正在编写一个应用程序,其中涉及将相当大的数据块写入 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 实现,该实现允许在不阻塞的情况下发送数据,这样就不会开始备份写入(哎呀,那时就不需要队列了)。我不知道是否有这样的实现——我一直找不到——而且我个人认为甚至不可能写一个。
那么,有人对我如何重新设计它有任何建议吗?