Параллельная обработка одного InputStream с независимыми потребителями

Мне нужно создать N потоков-потребителей, которые одновременно обрабатывают один и тот же InputStream, например, -каким-то образом преобразуют его, вычисляют контрольную сумму или цифровую подпись и т. д. Эти потребители не зависят друг от друга, и все они используют сторонние -сторонние библиотеки, которые принимают InputStream в качестве источника данных.

Итак, что я могу сделать, так это -создать некоторую реализацию InputStream, которая будет

  • прочитать часть данных из «родительского» потока
  • разблокировать потребителей
  • подождите, пока каждый потребитель не прочитает весь фрагмент
  • прочитать следующий фрагмент

хотя это выглядит просто, это может привести к различным проблемам, таким как живая блокировка, когда определенный потребитель умирает, реализовать все методы InputStream, управлять разветвлением/объединением самих потребителей с помощью барьеров/защелок и т. д.

Один приятель сказал мне, что это полчаса на реализацию, это сделало мой вечер.

Я бы предпочел либо использовать что-то достаточно зрелое, (гугление не дало результатов, таким образом, мое гугление -фу недостаточно хорошо? )или не заморачивайтесь и скопируйте весь "исходный" поток во временный файл и используйте его как источник данных. Последнее решение кажется более надежным, т.но может привести к созданию гигабайтных файлов (при обработке потокового аудио, например ).

7
задан jdevelop 4 July 2012 в 20:12
поделиться