Каким будет использование DelayQueue в реальном мире , какую распространенную проблему он призван решить?
источник
Каким будет использование DelayQueue в реальном мире , какую распространенную проблему он призван решить?
Я недавно использовал очередь задержки для ограничения скорости.
Для ограничения X событий в секунду поместите каждое событие в очередь с задержкой в 1 секунду.
Если в delayQueue есть X событий, возьмите () из очереди (которая блокируется, пока не истечет хотя бы 1). Таким образом, вы допускаете кратковременный всплеск, не превышая никаких долгосрочных ограничений.
Этот класс идеально подходит для потока, который хочет обработать несколько отложенных событий в правильном порядке.
Предположим, например, что у вас есть дисплей с 100 мигающими лампами, и все лампочки мигают с разными несвязанными частотами. Вы можете иметь поток для каждого источника света, или вы можете иметь один поток, координирующий их все, используя этот класс. Это будет работать примерно так:
Light
класс со скоростью вспышкиDelayed
интерфейса, который указывает на свет, скажем,LightFlash
DelayQueue
и добавьте новый LightFlash
для каждого источника света с задержкой, соответствующей частоте вспышкиDelayQueue заботится о получении следующего события для обработки.
Два реальных примера, которые я могу придумать:
DelayQueue
вероятно, реализован как приоритетная очередь , которая обычно лучше всего реализована в виде кучи .
основное использование было бы таймерами задач как классы для Таймера
если бы можно было сделать задержку независимой от системных часов (что, как я полагаю, вы можете, хотя и не уверен), вы можете использовать ее для игровых событий, таких как «после 5 тактов перейти к X» (в противном случае, дрожание часов делает это ненадежным)
Обратите внимание, что задержки связаны с элементами, которые идут в очередь, а не сама очередь. Некоторые объекты, попадающие в очередь, могут иметь нулевую задержку, а некоторые могут иметь гораздо более длительную задержку:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
Имея это в виду, я могу вспомнить несколько вариантов использования - хотя они, вероятно, будут хрупкими и немного пахнут кодом в отношении вашего потока сообщений. Я бы использовал альтернативы всем, кроме как в определенных ситуациях:
1) Поток управления - мы знаем, что обработка заказа занимает 60 секунд, поэтому не считывайте следующий заказ из очереди, пока объект не будет там хотя бы 60 секунд.
2) Поток сообщений - Очень асинхронная система , в которой мы посылаем запросы на 2 -й или 3 -х внешние услуги , а затем выпустить следующую задачу для обработки заказа N секунд позже , когда мы знаем , что первую партию рабочих мест, по крайней мере , имел возможность завершить ,
3) Пакетирование сообщений - возможно, заказы определенного типа являются пакетными, поэтому давайте не будем обрабатывать заказы, полученные за последние N секунд, чтобы мы могли видеть, поступают ли подобные заказы вскоре после этого, и могут ли они быть обработаны как пакет при следующем запуске.
4) Приоритеты сообщений - разные сообщения или разные клиенты могут получить немного более высокое качество обслуживания с меньшей или нулевой задержкой.
В некоторых случаях объекты, которые вы помещаете в очередь, должны находиться в этой очереди в течение определенного периода времени, прежде чем они будут готовы к снятию с очереди. Здесь вы используете класс java.util.concurrent.DelayQueue, который реализует интерфейс BlockingQueue. DelayQueue требует, чтобы объекты очереди находились в очереди в течение определенного промежутка времени.
Пример использования в реальном мире смотрите в статье Minding the Queue на сайте devx.
... Пример из реального мира, который я подумал проиллюстрировать (который может сделать вас голодным), касается кексов. Ну, объекты Маффин (как мы говорим на Java - кофе не предназначен). Предположим, у вас есть DelayQueue, в который вы помещаете объекты Muffin ... Метод getDelay, по сути, устанавливает, сколько времени осталось для сохранения объекта в DelayQueue. Когда число, возвращаемое этим методом, становится равным нулю или меньше нуля, объект готов (или в этом примере запечен) и может быть удален ...
Так как вы не хотите есть Маффин, который не был полностью приготовлен, поместите Маффин в DelayQueue на рекомендуемое время приготовления ...