[Java]: какую очередь использовать в моем сценарии? - PullRequest
2 голосов
/ 22 октября 2010

Я совершенно новичок в Java, но у меня есть срочные требования для создания очереди и потока.Я запутался, какой класс очереди должен использоваться.

Вот сценарий:

Мне нужен поток для обработки пользовательских событий из уровня приложения, а также событий обратного вызова из нижнего уровня промежуточного программного обеспечения.Для этого было решено, что очередь будет сохраняться.События будут публиковаться в этой очереди всякий раз, когда происходит пользовательское событие или событие обратного вызова.Поток опрашивает события в очереди и предпринимает соответствующие действия.В одну и ту же очередь могут записываться разные классы (т. Е. Прикладной уровень и нижний уровень).Следовательно, какая очередь будет более безопасной, чтобы гарантировать, что разные классы не будут одновременно записывать одно и то же местоположение?

Кроме того, каково основное различие в одном предложении между очередью, BlockingQueue и ArrayBlockingQueue и в каких сценарияхкаждый должен быть выбран?

С уважением, Кики

Ответы [ 4 ]

3 голосов
/ 22 октября 2010

В связи с «различием в несколько слов»: Queue и BlockingQueue являются интерфейсами, тогда как ArrayBlockingQueue является классом, который реализует интерфейс BlockingQueue.

Вы должны выбирать в основном между ConcurrentLinkedQueue и ArrayBlockingQueue / LinkedBlockingQueue.

Прежний предоставляет вам неограниченную очередь (не ограниченный размер греха), последний предоставляет очереди фиксированного размера, которые ждут, когда пространство станет доступным в очереди при хранении элемента.

В качестве альтернативы очередям + потокам можно рассматривать интерфейсы Executor и Future из параллельного пакета, они могут быть проще в использовании для реализации модели клиент-сервер.

3 голосов
/ 22 октября 2010

Из трех перечисленных вами, единственным, который фактически является классом, является ArrayBlockingQueue.Очередь блокировки отличается от обычной очереди тем, что, если объект пытается удалить передний элемент, он приостанавливает выполнение до тех пор, пока не появится доступный элемент для удаления.

«BlockingQueue» и «Queue» - это просто интерфейсы;Вы не можете создать их экземпляр.Типы BlockingQueue, которые вы можете создать, это ArrayBlockingQueue, LinkedBlockingQueue и т. Д.

Лично я бы использовал LinkedBlockingQueue для этого приложения - преимущество использования связанного списка состоит в том, что нет установленной максимальной емкости и использование памятиуменьшается по мере уменьшения очереди.

2 голосов
/ 22 октября 2010

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

Блокировка: Блокирует до тех пор, пока операция (put(),take() и т. Д.) Не станет возможной с дополнительным таймаутом. Неблокирование: Операция завершается мгновенно

Граница: Имеет верхний предел для количества элементов в очереди

Не-bound: Нет ограничений на количество элементов в очереди.

Что касается ArrayBlockingQueue, то он резервируется массивом, в то время как LinkedBlockingQueue резервируется LinkedList.

2 голосов
/ 22 октября 2010

Используйте высокоуровневый Executors.newSingleThreadExecutor ()

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