Time-based thread-safe priority queue(基于时间的线程安全优先级队列)
问题描述
我需要一些类似队列的数据结构来执行以下任务:
- 有些线程添加了附加延迟值的数据项(例如秒),例如
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队列中的元素。
这篇关于基于时间的线程安全优先级队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:基于时间的线程安全优先级队列


基础教程推荐
- Struts2 URL 无法访问 2022-01-01
- 如何对 Java Hashmap 中的值求和 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
- 修改 void 函数的输入参数,然后读取 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- 使用堆栈算法进行括号/括号匹配 2022-01-01
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- RabbitMQ:消息保持“未确认"; 2022-01-01