我需要一些类似队列的数据收缩来执行以下任务:
queue.add(data, delay)
。delay
排队的项目应减少1,直到达到0(然后它将保持不变为0)delay
为0
的项目中,出列顺序只是它们的插入顺序(尽管达到0
的顺序更好)delay = 0
元素。如果不存在,则阻止或抛出。因此,我想要一些队列功能+一些调度,线程安全。我怀疑在某些情况下这类事情应该是一项常规任务。
我的问题:对于此类任务,java
或scala
是否有任何生产就绪解决方案?我不想重新发明另一辆自行车。
编辑:似乎 java 标准库中存在确切的问题:DelayQueue
,请在回答之前先看看它。
答案 0 :(得分:3)
您可以使用PriorityQueue
作为输入Comparable
对象。
您应该根据Timestamp
字段比较这些对象(越小越好);正如@Henry已经提到的,最好存储Timestamp
而不是delay
。这很容易实现;只需存储currentTime + delay
。
然后,当客户端请求head元素时,您需要创建一个synchronized
方法来执行以下操作:
peek()
检查head元素是否有timestamp < currentTime
poll()
此元素,否则抛出。第二个解决方案(从我的评论中移除):
实际上,可以添加ScheduledThreadPoolExecutor作为中间层;
现在您不需要Timestamp
,只需向执行者提供delay
。
当每个runnable/callable
执行时,相应的对象被添加到另一个正常的FIFO队列中,在那里它将立即可用于轮询;
您的客户现在可以从第二个FIFO队列中轮询元素。