Мне нужно создать N потоков потребителей, которые обрабатывают один и тот же InputStream одновременно, например, - каким-то образом преобразуют его, вычисляют контрольную сумму или цифровую подпись и т. Д. Эти потребители не зависят друг от друга, и все они используют сторонние библиотеки, которые принимают InputStream в качестве источника данных.Параллельная обработка одиночного InputStream с независимыми потребителями
Так что я могу сделать, это - создать некоторую реализацию InputStream, который
- читать фрагмент данных из «родительского» потока
- разблокирования потребителей
- ожидания до каждого потребителя читать весь кусок
- прочитать следующий фрагмент
в то же время ищет простой, он может подниматься различные проблемы, как livelo ck, когда определенный потребитель умирает, реализует все методы InputStream, управляет fork/join самими потребителями, используя барьеры/затворы и т. д.
Один приятель сказал мне, что это половина часа, чтобы осуществить, это сделало мой вечер.
Я бы предпочел либо использовать что-то достаточно зрелым (googling не пришел с результатами, таким образом, мой google-fu не достаточно хорош?) Или не беспокоить и копировать весь поток «источника» во временный файл и использовать его в качестве источника данных. Последнее решение кажется более надежным, но может закончиться созданием гигабайтных файлов (например, при обработке потокового аудио).
Можете ли вы записать данные в файл и создать N FileInputStreams? –
@JonLin Как он сказал в конце вопроса, он может. –