У меня есть клиентский код, который читает из сокета (через входной поток) и записывает в файл (через BufferedWriter) в цикле:
dataInStream = new BufferedInputStream(dataSocket.getInputStream());
outputFile = new BufferedWriter(new FileWriter(filename));
byte bytes[] = new byte[64];
Message msg = new Message();
int bytesRead = 0;
while (true) {
bytesRead = dataInStream.read(bytes, 0, 64);
// create a message from the raw data...
msg.parse(bytes);
// write it to the file as a String
outputFile.write(msg.toString());
outputFile.flush();
}
(упрощенный код для демонстрации общего потока — мне интересно учиться только тогда, когда мне нужно добавить дополнительный поток записи)
В какой момент (с точки зрения скорости передачи данных) мне может понадобиться разделить операцию записи файла на другой поток (т. е. «записывающий») с чем-то вроде ConcurrentLinkedQueue между потоками чтения и записи?
Мои требования к скорости сообщений низкие (т.е. 1400 байт сообщений при макс. ~ 10 в секунду)
Тестовый код, который я запускал для оценки пропускной способности, показал, что он может легко обрабатывать 150 000 байт в секунду. Поскольку скорость передачи данных (какой бы она ни оказалась) постоянна, может ли писатель когда-либо блокироваться достаточно долго, чтобы вызвать потерю данных на считывателе?
Или это просто хорошая практика всегда иметь читательскую и цепочку авторов?