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

时间:2016-02-01 09:18:00

标签: java scala data-structures scheduling

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

  1. 某些线程添加具有附加延迟值的数据项(例如以秒为单位),例如, queue.add(data, delay)
  2. 可以有不同的延迟以及相同的队列应该作为优先级队列:较小的延迟项目更接近结束(更快地出列)
  3. 每隔一个delay排队的项目应减少1,直到达到0(然后它将保持不变为0)
  4. delay0的项目中,出列顺序只是它们的插入顺序(尽管达到0的顺序更好)
  5. 某些客户端线程系统地从此队列中获取元素,并且它仅提供delay = 0元素。如果不存在,则阻止或抛出。
  6. 因此,我想要一些队列功能+一些调度,线程安全。我怀疑在某些情况下这类事情应该是一项常规任务。

    我的问题:对于此类任务,javascala是否有任何生产就绪解决方案?我不想重新发明另一辆自行车。

    编辑:似乎 java 标准库中存在确切的问题:DelayQueue,请在回答之前先看看它。

1 个答案:

答案 0 :(得分:3)

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

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

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

第二个解决方案(从我的评论中移除):

实际上,可以添加ScheduledThreadPoolExecutor作为中间层; 现在您不需要Timestamp,只需向执行者提供delay

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

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