java - 非阻塞延迟队列,Java

标签 java concurrency delayed-job delayed-execution

我正在使用 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/

相关文章:

java - 下载pdf文件并保存到SD卡

c++ - 我想允许 xml 文件并发读取访问

git - git实现并发的加锁策略?

ruby-on-rails - Delayed_job : Undefined method error on any call

java - 遍历文件列表以检查里面有多少行

java - Java 中 TextArea 文本样式不会从斜体更改为纯文本

java - Spring 依赖注入(inject)失败

c++ - 同时写入和读取哈希表

ruby-on-rails - 带有 Capistrano 的 Bundler 不会为 DelayedJob 生成二进制文件

ruby-on-rails - 如何获得延迟的作业处理时间?