Нужна очередь, которая может поддерживать несколько читателей - PullRequest
3 голосов
/ 15 сентября 2009

Мне нужна очередь, которая может обрабатываться несколькими читателями.

Считыватели отключат элемент и отправят его в службу REST.

Что важно отметить:

  • Каждый читатель должен вывести из очереди разные элементы. Если в очереди есть элементы A, B и C, поток 1 должен удалить из очереди A, а поток 2 должен удалить из очереди B одновременно И так далее, пока в очереди ничего нет.
  • Я понимаю, что загрузка процессора всегда загружена в цикле занятости, заглядывая в очередь за предметами. Поэтому я не уверен, что очередь блокировки - хороший вариант.

Какие у меня варианты?

Ответы [ 3 ]

8 голосов
/ 15 сентября 2009

ConcurrentLinkedQueue или LinkedBlockingQueue - это две опции, которые сразу приходят на ум, в зависимости от того, хотите ли вы поведение блокировки или нет.

Как отмечает Адамски, take() метод LinkedBlockingQueue не сжигает циклы процессора в ожидании получения данных.

7 голосов
/ 15 сентября 2009

Я не уверен в описании вашего вопроса, нужно ли потокам удалять элементы в строгом циклическом порядке. Предполагая, что это не ограничение, вы можете использовать метод BlockingQueue take(), который заставит поток блокироваться до тех пор, пока данные не станут доступны (следовательно, не использует ЦП циклов).

Также обратите внимание, что take() реализации являются атомарными (например, LinkedBlockingQueue): если несколько потоков заблокированы на take() и один элемент помещен в очередь, тогда только один поток вызов take () вернется; другой останется заблокированным.

1 голос
/ 15 сентября 2009

Основное различие между ConcurrentLinkedQueue и LinkedBLockingQueue заключается в его пропускной способности. При умеренном конфликте потоков ConcurrentLinkedQueue значительно превосходит все остальные BlockingQueues. Однако в тяжелых условиях BlockingQueue является несколько лучшим выбором, поскольку он соответствующим образом помещает конкурирующие потоки в набор ожидающих потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...