基于时间的线程安全优先级队列

编程入门 行业动态 更新时间:2024-10-08 06:26:54
本文介绍了基于时间的线程安全优先级队列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我需要一些类似队列的数据结构来执行以下任务:

  • 有些线程添加了附加延迟值的数据项(例如秒),例如queue.add(data, delay)。
  • 既可以有不同的延迟,也可以有相同的延迟,队列应充当优先队列:延迟越小的项越接近末尾(出队速度更快)
  • 排队项每秒钟delay应减1,直到达到0(然后保持不变为0)
  • 在delay为0的项目中,出列顺序就是它们的插入顺序(虽然到达0的顺序更好)
  • 一些客户端线程系统地从该队列中获取元素,并且它只提供delay = 0元素。如果不存在,则它将阻塞或引发。
  • 因此,我想要一些队列的功能+一点调度、线程安全。我怀疑,在某些情况下,这类事情应该是一项相当常规的任务。

    我的问题:对于此类任务,是否有针对java或scala的生产就绪解决方案?我不想再发明另一辆自行车了。

    编辑:似乎在Java标准库中确实有这样的东西:DelayQueue,在回答之前先看一看。

    推荐答案

    您可以使用应作为输入Comparable对象的PriorityQueue。 您应该基于Timestamp字段比较这些对象(越小越好);正如@Henry已经提到的,存储Timestamp比存储delay更好。这非常容易实现;只需存储currentTime + delay。

    然后,当客户端请求head元素时,您需要创建一个synchronized方法,该方法执行以下操作:

    • 首先peek()检查head元素是否有timestamp < currentTime
    • 如果是,poll()这个元素,否则抛出。

    第二个解决方案(移植自我的评论):

    实际上,可以添加一个ScheduledThreadPoolExecutor作为中间层; 现在您不需要Timestamp,只需将delay提供给Executor。

    当每个runnable/callable执行时,相应的对象被添加到另一个正常的FIFO队列,在那里它将立即可用于轮询;

    您的客户端现在可以轮询第二个FIFO队列中的元素。

    更多推荐

    基于时间的线程安全优先级队列

    本文发布于:2023-11-29 06:10:12,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1645564.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:优先级   队列   线程   时间

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!