DelayQueue在现实世界中的使用


Answers:


8

我最近将延迟队列用于速率限制。

对于每秒X个事件的限制,请将每个事件放入延迟为1秒的延迟队列中。

如果delayQueue上有X个事件,请从队列中获取take()(阻塞直到至少1个过期)。这样,您可以进行短期爆发,而不会超出任何长期限制。


10

此类非常适合想要按其正确顺序处理多个延迟事件的线程。

例如,假设您的显示器上有100个闪烁的指示灯,并且所有指示灯以不同的无关速率闪烁。您可以为每个光源使用一个线程,或者可以使用此类让一个线程协调所有光源。它会像这样工作:

  • 有一个Light带有闪光灯率类
  • 创建Delayed指向光源的接口的实现,例如LightFlash
  • 创建您的光源DelayQueueLightFlash为每个光源添加一个新光源,并根据光源的闪烁速率设置延迟
  • 环:

DelayQueue负责处理下一个事件。

我可以想到两个真实的例子:

  • 需要执行某些定时操作(例如,对每个连接执行ping操作)的(非多线程)服务器。
  • 一个启用了JavaScript的浏览器的实现,该浏览器需要处理通过setInterval()setTimeout()创建的任意数量的定时事件。哦,还有GIF动画。

DelayQueue可能将其实现为优先级队列,通常最好将其实现为


3

主要用途是任务计时器,例如for Timer类

如果可以使延迟与系统时钟无关(我相信您可以,虽然不确定),则可以将其用于游戏事件,例如“ 5个滴答之后移至X”(否则时钟抖动会使该情况不可靠)


2

请注意,延迟与队列中的元素相关联,而不是队列本身。进入队列的某些对象的延迟可能为零,而某些对象的延迟可能更长:

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

考虑到这一点,我可以想到一些用例-尽管它们可能很脆弱,并且与您的消息传递流有关,但有些代码味道。除特殊情况外,我将对所有其他方法使用替代方法:

1)控制流-我们知道订单需要60秒才能处理,因此在对象到达那里至少60秒之前,请不要从队列中读取下一个订单。

2)消息流-一个高度异步的系统,在该系统中,我们知道第一批作业将至少有机会完成后,在N秒后将请求发送给2或3个外部服务,然后释放下一个任务以处理订单。

3)邮件批处理-某些类型的订单可能是突发性的,因此不要处理最近N秒钟内收到的订单,这样我们就可以查看之后不久是否收到类似的订单,可以在下次运行中将其作为批处理。

4)消息优先级-不同的消息或不同的客户可以获得较低或零延迟的更高服务质量。


1

在某些情况下,放置在队列中的对象应该在该队列中放置一定的时间,然后才能准备出队。在这里使用java.util.concurrent.DelayQueue类,该类实现BlockingQueue接口。DelayQueue要求队列对象在队列上驻留指定的时间。

有关实际用法示例,请参阅devx网站上的“注意队列”文章

...我想用来说明这一点的现实示例(这可能会使您感到饥饿)涉及松饼。好吧,松饼对象(正如我们在谈论Java一样-不需要咖啡双关语)。假设您有一个放置Muffin对象的DelayQueue ...本质上,getDelay方法说明了将对象保留在DelayQueue中的时间。当此方法返回的数字变为零或小于零时,对象已准备就绪(或在此示例中为烘烤对象)并允许出队...

由于您真的不想吃未完全煮熟的松饼,因此请将松饼放在DelayQueue上以获得建议的烹饪时间...


1
我了解它的作用,但不了解它旨在解决的常见问题,我正在寻找用例
Eran Medan 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.