ile eşzamanlı yazma Bir OutputStream'e (bir Sokete ait) büyük miktarda veri parçaları yazmayı içeren bir uygulama yazıyorum. Bunu biraz karmaşık hale getiren şey, genellikle aynı OutputStream'e yazmayı deneyen çok sayıda iş parçacığı olmasıdır. Şu anda, verilerin yazılmakta olduğu OutputStream'in kendi iş parçacığı olması için tasarladım. İş parçacığı, bayt dizilerini yoklayan ve bunları en kısa zamanda yazan bir sıra (LinkedList) içerir.Standart bir OutputStream
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();
}
}
}
}
bu tasarım ile sorun daha da yazıyor ortaya çıktıkça, daha fazla veri kuyruklar yukarı ve daha hızlı yazılı almıyor olmasıdır. Başlangıçta, veriler sıraya konduğunda, hemen anında yazılır. Daha sonra yaklaşık 15 saniye sonra, veriler geride kalmaya başlar; Bir gecikme, verilerin gerçekte yazıldığı tarihe sıraya konulduktan sonra gelişir. Zaman geçtikçe, bu gecikme daha uzun ve daha uzun olur. Bu çok fark edilir.
Bunu düzeltmenin bir yolu, verilerin engellenmeye başlamaması için yazımın engellenmeden gönderilmesini sağlayan bir tür ConcurrentOutputStream uygulaması olabilir (heck, sıra o zaman gereksiz olur). Böyle bir uygulama olup olmadığını bilmiyorum - bir tane bulamadım - ve kişisel olarak bir tane bile yazmanın mümkün olmadığını düşünüyorum.
Peki, bunu nasıl yeniden tasarlayabileceğimi öneren var mı?
Bu çok yapıcı değil. Bunun nesi var? –
BufferedOutputStream? –
Bir kenara göre, bağlantılarınızı bağlı listenize senkronize ediyor musunuz? Çünkü tasarım tarafından iş parçacığı güvenli değildir. Ayrıca, soket çıkışının üstünde ne tür bir çıkış akışı var ve bunun üzerinden ne kadar veri aktarıyorsunuz? – Perception