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

Time-based thread-safe priority queue

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

  1. 一些线程添加带有附加延迟值(例如以秒为单位)的数据项,例如queue.add(data, delay).
  2. 可以有不同的延迟也可以相同,队列应该作为优先队列:延迟越小的项目越接近尾部(更快地出队)
  3. 每秒钟delay排队的项目应该减少1直到达到0(然后它将保持不变为0)
  4. delay0 的项目中,出队顺序就是它们的插入顺序(尽管达到 0 的顺序更好)
  5. 一些客户端线程系统地从这个队列中获取元素,它只给出了delay = 0元素。如果 none 这样的存在,那么它会阻塞,或者抛出。

因此,我想要队列的一些功能+一点调度,线程安全。我怀疑这种类型的事情在某些情况下应该是一项非常常规的任务。

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

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

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

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

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

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

其实可以加一个ScheduledThreadPoolExecutor作为中间层; 现在你不需要 Timestamp,只需向执行者提供 delay

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

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