Неблокирующие PipedStreams? - PullRequest
       19

Неблокирующие PipedStreams?

1 голос
/ 12 октября 2011

PipedInputStream и PipedOutputStream используются для передачи данных между потоками.«Данные считываются из объекта PipedInputStream одним потоком, а данные записываются в соответствующий PipedOutputStream другим потоком».

Пока все хорошо.Одна потенциальная выгода, которую я вижу из этой парадигмы, состоит в том, что спорадический производитель (OutputStream) не должен быть замедлен медленным потребителем (InputStream).Другими словами, во времена, когда OutputStream внезапно выдает большое количество данных, которые потребитель не может использовать сразу, OutputStream не нужно ждать, пока произведенные данные будут полностью использованы, прежде чем продолжить работу сего жизнь.

Вопрос 1: Правильно ли мое понимание?Является ли это одним из преимуществ этой конструкции PipedStreams?

Если ответ на вопрос 1 положительный, тогда:

Это хорошо работает, когда буфер не заполнен, но когда буфер заполненв реализации JDK6 PipedOutputStream блокирует и ожидает освобождения большего пространства.Это превосходит цель, о которой я говорил выше, не так ли?

Кажется, что эту проблему очень легко решить, изменив поведение в случаях полного буфера от ожидания нового места до выделения большего буфера.Возможно, я смогу реализовать его за пару минут, но я бы не хотел изобретать велосипед, если что-то подобное уже доступно.Я немного погуглил, но не смог найти ничего, что меня удивило.

Может ли кто-нибудь указать мне правильное направление?Или укажите, где я ошибаюсь в своих мыслях?

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

PipedOutputStream на самом деле не предназначен для буферизации результатов таким способом (буферизация является скорее побочным эффектом в его реализации) Как говорит Javadoc:

"Поток входного потока содержит буфер, отделяющий операции чтения от операций записи, в пределах . "

Для буферизации, как вы описываете, я бы использовал http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html.

0 голосов
/ 12 октября 2011

Я не думаю, что у PipedOutputStream есть какие-либо гарантии относительно буферизации вывода до тех пор, пока PipedInputStream не будет готов.Таким образом, ответ - нет, хотя на практике вы можете заметить некоторую буферизацию.

РЕДАКТИРОВАТЬ: попробуйте поискать термин «кольцевой буфер».Не знаю ни одного, но это общее название для этого типа дела.

...