Нужна очередь, которая может поддерживать несколько читателей

StackOverflow https://stackoverflow.com/questions/1426342

Вопрос

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

Читатели удалят элемент из очереди и отправят его в службу REST.

Важно отметить следующее:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top