Sto scrivendo un'applicazione che comporta la scrittura di considerevoli blocchi di dati su un OutputStream (appartenente a un socket). La cosa che rende questo un po 'complicato è che di solito ci sono più thread che tentano di scrivere sullo stesso OutputStream. Attualmente, l'ho progettato in modo che l'OutputStream a cui i dati vengono scritti sia nella sua stessa thread. Il thread contiene una coda (LinkedList) che esegue il polling degli array di byte e li scrive al più presto possibile.Scrittura simultanea su uno standard 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();
}
}
}
}
Il problema di questo progetto è che, come si verificano sempre più operazioni di scrittura, sempre più code di dati su e non è sempre scritto più velocemente. Inizialmente, quando i dati vengono messi in coda, vengono scritti praticamente immediatamente. Quindi, dopo circa 15 secondi circa, i dati iniziano a rimanere indietro; un ritardo si sviluppa dal momento in cui i dati vengono accodati al momento in cui i dati vengono effettivamente scritti. Col passare del tempo, questo ritardo diventa sempre più lungo. È molto notevole.
Un modo per risolvere il problema sarebbe una sorta di implementazione ConcurrentOutputStream che consente di inviare i dati senza bloccare in modo che le scritture non inizino a essere sottoposte a backup (diamine, quindi la coda non sarebbe necessaria). Non so se ci sia una tale implementazione - non sono stato in grado di trovarne una - e personalmente non credo sia nemmeno possibile scriverne una.
Quindi, qualcuno ha qualche suggerimento su come posso riprogettare questo?
Non è molto costruttivo. Che cosa c'è che non va? –
BufferedOutputStream? –
Come parte, stai sincronizzando le modifiche alla tua lista collegata? Perché non è thread-safe dal design. Inoltre, che tipo di flusso di output stai sovrapponendo all'output del socket e quanti dati stai trasmettendo? – Perception