私は、(ソケットに属する) OutputStream にかなり大きなデータのチャンクを書き込むアプリケーションを作成しています。これを少し複雑にしているのは、通常複数のスレッドが同じ 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 実装であるため、書き込みがバックアップされ始めません (その場合、キューは不要になります)。そのような実装が存在するかどうかはわかりません -- 私は見つけることができませんでした -- 個人的には、それを書くことさえ不可能だと思います。
それで、これを再設計する方法について何か提案はありますか?