DelayQueue在现实世界中的用途是什么,它旨在解决哪些常见问题?
DelayQueue在现实世界中的用途是什么,它旨在解决哪些常见问题?
Answers:
此类非常适合想要按其正确顺序处理多个延迟事件的线程。
例如,假设您的显示器上有100个闪烁的指示灯,并且所有指示灯以不同的无关速率闪烁。您可以为每个光源使用一个线程,或者可以使用此类让一个线程协调所有光源。它会像这样工作:
Light
带有闪光灯率类Delayed
指向光源的接口的实现,例如LightFlash
DelayQueue
并LightFlash
为每个光源添加一个新光源,并根据光源的闪烁速率设置延迟DelayQueue负责处理下一个事件。
我可以想到两个真实的例子:
请注意,延迟与队列中的元素相关联,而不是队列本身。进入队列的某些对象的延迟可能为零,而某些对象的延迟可能更长:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
考虑到这一点,我可以想到一些用例-尽管它们可能很脆弱,并且与您的消息传递流有关,但有些代码味道。除特殊情况外,我将对所有其他方法使用替代方法:
1)控制流-我们知道订单需要60秒才能处理,因此在对象到达那里至少60秒之前,请不要从队列中读取下一个订单。
2)消息流-一个高度异步的系统,在该系统中,我们知道第一批作业将至少有机会完成后,在N秒后将请求发送给2或3个外部服务,然后释放下一个任务以处理订单。
3)邮件批处理-某些类型的订单可能是突发性的,因此不要处理最近N秒钟内收到的订单,这样我们就可以查看之后不久是否收到类似的订单,可以在下次运行中将其作为批处理。
4)消息优先级-不同的消息或不同的客户可以获得较低或零延迟的更高服务质量。
在某些情况下,放置在队列中的对象应该在该队列中放置一定的时间,然后才能准备出队。在这里使用java.util.concurrent.DelayQueue类,该类实现BlockingQueue接口。DelayQueue要求队列对象在队列上驻留指定的时间。
有关实际用法示例,请参阅devx网站上的“注意队列”文章
...我想用来说明这一点的现实示例(这可能会使您感到饥饿)涉及松饼。好吧,松饼对象(正如我们在谈论Java一样-不需要咖啡双关语)。假设您有一个放置Muffin对象的DelayQueue ...本质上,getDelay方法说明了将对象保留在DelayQueue中的时间。当此方法返回的数字变为零或小于零时,对象已准备就绪(或在此示例中为烘烤对象)并允许出队...
由于您真的不想吃未完全煮熟的松饼,因此请将松饼放在DelayQueue上以获得建议的烹饪时间...