BlockingQueue - один производитель несколько потребителей

У меня три потока. Поток 1 (T1) - производитель, который генерирует данные. Каждый из потоков 2 и 3 (T2, T3 соответственно) ожидает обработки данных T1 в отдельных циклах. Я думаю о том, чтобы разделить BlockingQueue между потоками и заставить T2 и T3 ждать, вызывая "take".

документы для java.util .concurrent.BlockingQueue говорит, что его можно «безопасно использовать с несколькими производителями и несколькими потребителями». Пробуя пример из документации, кажется, что поведение состоит в том, чтобы позволить одному потребителю «взять» объект «положить» вместо того, чтобы все они его получили. Итак, данные получают либо Т2, либо Т3, и кажется, что они чередуются. Я бы хотел, чтобы они оба получали одни и те же данные, когда T1 помещает некоторые данные.

У меня вопрос: подходит ли BlockingQueue? Стоит ли думать об этой проблеме по-другому?


person Tim Romanski    schedule 07.03.2020    source источник
comment
Обычно в очереди один и только один потребитель получает один элемент из очереди. Очередь в супермаркете обслуживает не один кассир, а каждый кассир. Если вы хотите, чтобы каждый элемент, созданный T1, обрабатывался дважды (один раз T2 и один раз T3), вам понадобится отдельная очередь для каждого потребителя.   -  person Ivan    schedule 11.03.2020


Ответы (1)


Похоже на Publish-Subscribe: вы публикуете данные в теме, и все зарегистрированные потребители получают копию сообщения. Напротив, очередь доставляет сообщение только одному зарегистрированному потребителю. Я рекомендую вам пересмотреть дизайн этого компонента.

BlockingQueue, по сути Queue реализация, как следует из названия, представляет собой очередь, которая позволяет добавлять и исследовать объекты. Эти операции являются потокобезопасными, что означает, например, что никакие два потока не получают один и тот же объект при проверке.

person Glains    schedule 07.03.2020
comment
Спасибо! Для всех, кому интересно, я реализовал Pub / Sub, каждый подписчик со своей собственной BlockingQueue. Издатели называют «положить» на публикацию, подписчики ждут, «взяв» из своих соответствующих BlockingQueues. - person Tim Romanski; 12.03.2020