У меня есть представление как работает этот класс, но хочется понять в какой ситуации его реализация принесет мне выгоды, я не могу даже придумать, помогите пожалуйста разобраться.
2 Answers
BlockingQueue - это очередь Queue со следующими дополнениями:
- Блокирующая операция
take()- берет следующий элемент, если же очередь пустая - блокирует выполнение до появления элемента (до момента, когда перестанет быть пустой) - Блокирующая операция
put(E e)- помещает элемент в очередь, если очередь заполнена - блокирует выполнение до освобождения места в очереди и успешного помещения в нее нового элемента.
Предназначена для реализации взаимодействия "поставщик - потребитель". Реализации методов потокобезопасны (синхронизированы), так что и писать в нее, и читать из неё можно в несколько потоков. Цитата из JavaDoc:
Note that a BlockingQueue can safely be used with multiple producers and multiple consumers.
Пример 1:
Пусть есть магазин с 3 входами и 2 кассами. Покупатели прут через 3 входа и выходят через 2 кассы. Очередь в кассы общая. Целесообразно хранить очередь покупателей в BlockingQueue.
Пример 2:
Имеется конвейер, выпускающий детали. Для производства нужны заготовки. С нескольких автоматов предыдущего этапа производства поступают заготовки, роботы берут их и делают из них детали. На следующем этапе эти детали используются для производства узлов другими роботами. Целесообразно хранить очередь входящих заготовок и очередь исходящих деталей (для следующего этапа) в BlockingQueue.
- 1,537
- 8
- 16
BlockingQueue - как можно понять из документации используется для того, чтобы выполнить операцию над данными в другом месте или времени, не там где они были получены.
Самый распространенный пример это обработки сообщений(обновление данных). Получаются данные(эвенты) в одном потоке(их может быть несколько) и записываются в BlockingQueue, в это же время другой потом(он должен быть один) ожидает элементов в этой очереди(метод take) и как только получает данные начинает обработку. Это позволяет избежать ситуации, когда несколько потоков пытаются записать одни и те же данные.
- 4,172
-
Это очень интересно, но избежать записи одних и тех же данных можно разными путями просто синхронизировать их, а здесь я так понимаю мы порциями запускаем потоки, но тогда чем это будет отличаться от того же самого фиксированного пула к примеру Executors.newFixedThreadPool(10); ? я всё равно до конца не понимаю смысл очереди, просто класс который имеет ещё одну иерархию для группировки потоков с возможностью запускать их порциями? Ещё одна абстрактная ячейка для выполнения больших операций разделенных множествами нитей. – Dasha Mar 30 '16 at 14:01
-
@Dasha речь идет о записи именно очереди, последовательности данных, которые будут обрабатываться (например, записываться на диск и т.п.) последовательно в другом потоке. В этот самый "другой поток" их надо как то передать. Передавать каждый объект для обработки можно и без создания очереди, но тогда нельзя будет "добавлять в очередь" новые пришедшие данные. Другими словами, если вы будете решать какую-то аналогичную практическую задачу другими средствами, вы в итоге напишите ту же самую BlockingQueue – Vladimir Bershov Nov 28 '17 at 13:38