Реальное использование DelayQueue [закрыто]

18

Каким будет использование DelayQueue в реальном мире , какую распространенную проблему он призван решить?

Эран Медан
источник

Ответы:

8

Я недавно использовал очередь задержки для ограничения скорости.

Для ограничения X событий в секунду поместите каждое событие в очередь с задержкой в ​​1 секунду.

Если в delayQueue есть X событий, возьмите () из очереди (которая блокируется, пока не истечет хотя бы 1). Таким образом, вы допускаете кратковременный всплеск, не превышая никаких долгосрочных ограничений.

Эндрю Хилл
источник
10

Этот класс идеально подходит для потока, который хочет обработать несколько отложенных событий в правильном порядке.

Предположим, например, что у вас есть дисплей с 100 мигающими лампами, и все лампочки мигают с разными несвязанными частотами. Вы можете иметь поток для каждого источника света, или вы можете иметь один поток, координирующий их все, используя этот класс. Это будет работать примерно так:

  • есть Lightкласс со скоростью вспышки
  • создать реализацию Delayedинтерфейса, который указывает на свет, скажем,LightFlash
  • создайте DelayQueueи добавьте новый LightFlashдля каждого источника света с задержкой, соответствующей частоте вспышки
  • цикл:
    • получить событие с DelayQueue :: take () .
    • включить / выключить свет
    • добавить новое событие в очередь для следующей вспышки с помощью DelayQueue :: put (E) .

DelayQueue заботится о получении следующего события для обработки.

Два реальных примера, которые я могу придумать:

  • (Не многопоточный) сервер, который должен выполнять определенные синхронизированные действия, например, пинг соединения для каждого соединения.
  • Реализация браузера с поддержкой javascript, который должен иметь дело с произвольным числом временных событий, созданных с помощью setInterval () и setTimeout () . Ох и анимированные гифки.

DelayQueueвероятно, реализован как приоритетная очередь , которая обычно лучше всего реализована в виде кучи .

Майкл Слэйд
источник
3

основное использование было бы таймерами задач как классы для Таймера

если бы можно было сделать задержку независимой от системных часов (что, как я полагаю, вы можете, хотя и не уверен), вы можете использовать ее для игровых событий, таких как «после 5 тактов перейти к X» (в противном случае, дрожание часов делает это ненадежным)

чокнутый урод
источник
2

Обратите внимание, что задержки связаны с элементами, которые идут в очередь, а не сама очередь. Некоторые объекты, попадающие в очередь, могут иметь нулевую задержку, а некоторые могут иметь гораздо более длительную задержку:

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html

Имея это в виду, я могу вспомнить несколько вариантов использования - хотя они, вероятно, будут хрупкими и немного пахнут кодом в отношении вашего потока сообщений. Я бы использовал альтернативы всем, кроме как в определенных ситуациях:

1) Поток управления - мы знаем, что обработка заказа занимает 60 секунд, поэтому не считывайте следующий заказ из очереди, пока объект не будет там хотя бы 60 секунд.

2) Поток сообщений - Очень асинхронная система , в которой мы посылаем запросы на 2 -й или 3 -х внешние услуги , а затем выпустить следующую задачу для обработки заказа N секунд позже , когда мы знаем , что первую партию рабочих мест, по крайней мере , имел возможность завершить ,

3) Пакетирование сообщений - возможно, заказы определенного типа являются пакетными, поэтому давайте не будем обрабатывать заказы, полученные за последние N секунд, чтобы мы могли видеть, поступают ли подобные заказы вскоре после этого, и могут ли они быть обработаны как пакет при следующем запуске.

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

Бенджамин Вуттон
источник
1

В некоторых случаях объекты, которые вы помещаете в очередь, должны находиться в этой очереди в течение определенного периода времени, прежде чем они будут готовы к снятию с очереди. Здесь вы используете класс java.util.concurrent.DelayQueue, который реализует интерфейс BlockingQueue. DelayQueue требует, чтобы объекты очереди находились в очереди в течение определенного промежутка времени.

Пример использования в реальном мире смотрите в статье Minding the Queue на сайте devx.

... Пример из реального мира, который я подумал проиллюстрировать (который может сделать вас голодным), касается кексов. Ну, объекты Маффин (как мы говорим на Java - кофе не предназначен). Предположим, у вас есть DelayQueue, в который вы помещаете объекты Muffin ... Метод getDelay, по сути, устанавливает, сколько времени осталось для сохранения объекта в DelayQueue. Когда число, возвращаемое этим методом, становится равным нулю или меньше нуля, объект готов (или в этом примере запечен) и может быть удален ...

Так как вы не хотите есть Маффин, который не был полностью приготовлен, поместите Маффин в DelayQueue на рекомендуемое время приготовления ...

Shree
источник
1
Я понимаю, что он делает, но не то, какую общую проблему он призван решить, я ищу варианты использования
Эран Медан