基于时间的线程安全优先级队列
Time-based thread-safe priority queue
我需要一些类似队列的数据结构来完成以下任务:
- 一些线程添加带有附加延迟值(例如以秒为单位)的数据项,例如
queue.add(data, delay)
.
- 可以有不同的延迟也可以相同,队列应该作为优先队列:延迟越小的项目越接近尾部(更快地出队)
- 每秒钟
delay
排队的项目应该减少1直到达到0(然后它将保持不变为0)
- 在
delay
为 0
的项目中,出队顺序就是它们的插入顺序(尽管达到 0
的顺序更好)
- 一些客户端线程系统地从这个队列中获取元素,它只给出了
delay = 0
元素。如果 none 这样的存在,那么它会阻塞,或者抛出。
因此,我想要队列的一些功能+一点调度,线程安全。我怀疑这种类型的事情在某些情况下应该是一项非常常规的任务。
我的问题:是否有针对此类任务的 java
或 scala
的生产就绪解决方案?我不想重新发明另一辆自行车。
编辑:似乎在java标准库中确实有这样的东西:DelayQueue
,在回答之前先看看它。
您可以使用一个 PriorityQueue
应该作为输入的 Comparable
对象。
您应该根据 Timestamp
字段比较这些对象(越小越好);正如@Henry 已经提到的那样,存储 Timestamp
而不是 delay
会更好。这很容易实现;只需存储 currentTime + delay
.
然后,当客户端请求头部元素时,您需要创建一个synchronized
方法来执行以下操作:
- 首先
peek()
检查头元素是否有timestamp < currentTime
- 如果是,
poll()
这个元素,否则抛出。
第二个解决方案(从我的评论中移植):
其实可以加一个ScheduledThreadPoolExecutor作为中间层;
现在你不需要 Timestamp
,只需向执行者提供 delay
。
当每个 runnable/callable
执行时,相应的对象被添加到另一个正常的 FIFO 队列中,它将立即可用于轮询;
您的客户端现在可以从第二个 FIFO 队列中轮询元素。
我需要一些类似队列的数据结构来完成以下任务:
- 一些线程添加带有附加延迟值(例如以秒为单位)的数据项,例如
queue.add(data, delay)
. - 可以有不同的延迟也可以相同,队列应该作为优先队列:延迟越小的项目越接近尾部(更快地出队)
- 每秒钟
delay
排队的项目应该减少1直到达到0(然后它将保持不变为0) - 在
delay
为0
的项目中,出队顺序就是它们的插入顺序(尽管达到0
的顺序更好) - 一些客户端线程系统地从这个队列中获取元素,它只给出了
delay = 0
元素。如果 none 这样的存在,那么它会阻塞,或者抛出。
因此,我想要队列的一些功能+一点调度,线程安全。我怀疑这种类型的事情在某些情况下应该是一项非常常规的任务。
我的问题:是否有针对此类任务的 java
或 scala
的生产就绪解决方案?我不想重新发明另一辆自行车。
编辑:似乎在java标准库中确实有这样的东西:DelayQueue
,在回答之前先看看它。
您可以使用一个 PriorityQueue
应该作为输入的 Comparable
对象。
您应该根据 Timestamp
字段比较这些对象(越小越好);正如@Henry 已经提到的那样,存储 Timestamp
而不是 delay
会更好。这很容易实现;只需存储 currentTime + delay
.
然后,当客户端请求头部元素时,您需要创建一个synchronized
方法来执行以下操作:
- 首先
peek()
检查头元素是否有timestamp < currentTime
- 如果是,
poll()
这个元素,否则抛出。
第二个解决方案(从我的评论中移植):
其实可以加一个ScheduledThreadPoolExecutor作为中间层;
现在你不需要 Timestamp
,只需向执行者提供 delay
。
当每个 runnable/callable
执行时,相应的对象被添加到另一个正常的 FIFO 队列中,它将立即可用于轮询;
您的客户端现在可以从第二个 FIFO 队列中轮询元素。