Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

BlockingQueue когда, зачем и ради чего?

#java #android


У меня есть представление как работает этот класс, но хочется понять в какой ситуации
его реализация принесет мне выгоды, я не могу даже придумать, помогите пожалуйста разобраться.
    


Ответы

Ответ 1



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.

Ответ 2



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

Комментариев нет:

Отправить комментарий