我正在使用Java的DelayQueue在第二次延迟后调度事件。但是问题是,在高负载下,我的使用者在DelayQueue上阻塞,直到其他线程的大部分offer()操作都消失了。
有谁知道Java中的非阻塞延迟队列实现?
最佳答案
我认为您误解了DelayQueue
API或线程调度的工作方式。
如果您想要真正的非阻塞队列操作,则DelayQueue
已经提供了它们。例如,poll()
将立即返回队列条目或null
。它不会阻塞调用线程。 offer(...)
方法是等效的无阻塞插入方法。
另一方面,如果您实际上是在说某些线程正在“饥饿”,那么您将无能为力。 Java线程调度不公平:
如果您有许多可运行的线程,则不会尝试为每个线程分配相似的运行时间。
如果您有多个线程在等待原始锁或通知,则调度程序将不会尝试“公平地”选择一个线程。
如果线程数量多于运行内核的数量,那么线程饥饿的可能性就会更大。
最好的解决方案是设计算法,以使线程的调度是否不重要都无关紧要。没关系;参见Is a DelayQueue without fairness problematic?。
出于记录,我不知道广告合理调度的DelayQueue
替代产品。