Використання DelayQueue в реальному світі [закрито]


18

Яким було б використання DelayQueue у реальному світі , яку загальну проблему він розробив?

Відповіді:


8

Нещодавно я використовував чергу затримки для обмеження ставок.

Для обмеження X подій на секунду розміщуйте кожну подію у черзі затримки із затримкою на 1 секунду.

Якщо на черзі затримки X є події, візьміть () з черги (яка блокується до закінчення принаймні 1). Таким чином ви дозволяєте короткочасний сплеск, не перевищуючи жодних довгострокових лімітів.


10

Цей клас ідеально підходить для потоку, який хоче обробити декілька затриманих подій належним чином.

Припустимо, наприклад, у вас дисплей зі 100 миготливими вогнями, і всі блимають з різними непов'язаними швидкостями. У вас може бути потік для кожного світла, або ви можете мати один поток, який координує їх усіх за допомогою цього класу. Це спрацювало б приблизно так:

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

DelayQueue піклується про отримання наступної події для обробки.

Я можу придумати два реальні приклади:

  • Сервер (не багатопоточний), якому потрібно виконати певні тимчасові дії, наприклад, ping з'єднання для кожного з'єднання.
  • Впровадження браузера з підтримкою JavaScript, який повинен мати справу з довільною кількістю приурочених подій, створених за допомогою setInterval () та setTimeout () . О, і анімовані GIF.

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 Queue на сайті devx

... Приклад реального світу, про який я думав, щоб проілюструвати це (що може зробити вас голодним), передбачає кекси. Що ж, Muffin об'єкти (як ми говоримо Java - кавова кавка не призначена). Припустимо, у вас є DelayQueue, на яку ви розміщуєте Muffin об’єкти ... Метод getDelay, по суті, визначає, скільки часу залишилось для об'єкта, який повинен зберігатися в DelayQueue. Коли число, повернене цим методом, стає нульовим або меншим від нуля, об'єкт готовий (або в цьому прикладі запечений) і дозволено його вилучити ...

Оскільки ви не хочете їсти кекси, які не повністю приготовані, поставте кекси на DelayQueue для рекомендованого часу приготування ...


1
Я розумію, що це робить, але не те, яка загальна проблема була розроблена для вирішення, я шукаю випадки використання
Еран Медан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.