Нужна очередь, которая может поддерживать несколько читателей
-
07-07-2019 - |
Вопрос
Мне нужна очередь, которую могут обрабатывать несколько читателей.
Читатели удалят элемент из очереди и отправят его в службу REST.
Важно отметить следующее:
- Каждый читатель должен удалять из очереди разные элементы.Если в очереди есть элементы A, B и C, поток 1 должен исключить A из очереди, а поток 2 должен исключить B из очереди одновременно.И так до тех пор, пока в очереди ничего не останется.
- Я понимаю, что постоянная работа в цикле занятости, просматривая очередь в поисках элементов, требует большого количества ресурсов процессора.Поэтому я не уверен, что очередь блокировки является хорошим вариантом.
Какие у меня есть варианты?
Решение
ConcurrentLinkedQueue или LinkedBlockingQueue — это два варианта, которые сразу приходят на ум, в зависимости от того, хотите ли вы блокировать поведение или нет.
Как отмечает Адамски, take()
метод LinkedBlockingQueue
не сжигает без необходимости циклы процессора в ожидании поступления данных.
Другие советы
Судя по описанию вашего вопроса, я не уверен, нужно ли потокам удалять элементы из очереди в строгом циклическом режиме.Предполагая, что это не ограничение, которое вы можете использовать BlockingQueue
's take()
метод, который приведет к блокировке потока до тех пор, пока данные не станут доступны (поэтому не потребляет процессор циклы).
Также обратите внимание, что take()
реализации являются атомарными (например, LinkedBlockingQueue
):Если несколько потоков заблокированы take()
и тогда в очередь ставится один элемент только один вызов take() потока вернет результат;другой останется заблокированным.
Основное различие между ConcurrentLinkedQueue и LinkedBLockingQueue заключается в его пропускной способности.При умеренной конкуренции потоков ConcurrentLinkedQueue значительно превосходит все остальные BlockingQueue.Однако в условиях серьезной конкуренции BlockingQueue является немного лучшим выбором, поскольку он соответствующим образом помещает конкурирующие потоки в набор ожидающих потоков.