我正在使用 Java 的 DelayQueue在第二次延迟后调度事件。但问题是,在重负载下,DelayQueue 上的消费者会阻塞,直到来自另一个线程的大量 Offer() 操作消失。
有谁知道Java中的非阻塞延迟队列实现吗?
最佳答案
我认为您误解了 DelayQueue
API 或线程调度的工作方式。
如果您想要真正的非阻塞队列操作,那么 DelayQueue
已经提供了它们。例如,poll()
将立即返回队列条目或 null
。它不会阻塞调用线程。 offer(...)
方法是无阻塞插入的等效方法。
另一方面,如果您实际上是说某些线程“饥饿”,那么您对此无能为力。 Java线程调度并不“公平”:
如果您有许多可运行的线程,则不会尝试为每个线程提供相似的运行时间。
如果有多个线程等待原始锁或通知,那么调度程序将不会尝试“公平”地选择一个线程。
如果线程数量多于运行它们的核心数量,则更有可能出现线程匮乏的情况。
最好的解决方案是设计你的算法,这样即使线程调度不公平也没关系。应该没关系;请参阅Is a DelayQueue without fairness problematic? .
<小时/>郑重声明,我不知道有宣传公平调度的 DelayQueue
替代品。
关于java - 非阻塞延迟队列,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28367777/