我正在使用Java的DelayQueue在第二次延迟后调度事件。但是问题是,在高负载下,我的使用者在DelayQueue上阻塞,直到其他线程的大部分offer()操作都消失了。

有谁知道Java中的非阻塞延迟队列实现?

最佳答案

我认为您误解了DelayQueue API或线程调度的工作方式。

如果您想要真正的非阻塞队列操作,则DelayQueue已经提供了它们。例如,poll()将立即返回队列条目或null。它不会阻塞调用线程。 offer(...)方法是等效的无阻塞插入方法。

另一方面,如果您实际上是在说某些线程正在“饥饿”,那么您将无能为力。 Java线程调度不公平:


如果您有许多可运行的线程,则不会尝试为每个线程分配相似的运行时间。
如果您有多个线程在等待原始锁或通知,则调度程序将不会尝试“公平地”选择一个线程。


如果线程数量多于运行内核的数量,那么线程饥饿的可能性就会更大。

最好的解决方案是设计算法,以使线程的调度是否不重要都无关紧要。没关系;参见Is a DelayQueue without fairness problematic?



出于记录,我不知道广告合理调度的DelayQueue替代产品。

10-06 07:53