我需要使用PriorityQueue
来排序FIFO元素。该队列将包含一个Message对象,每个对象都有double timestamp
以及int counter
,它跟踪已收到该消息的确认数。
有两种类型的消息 - 具有数据的消息和具有确认的消息。只有包含数据的消息才会被放入队列中。我正在编写一个比较器,用于对队列进行排序。只有在收到所有确认后,我才会弹出队列的头部。
问题是,当收到确认消息时,我需要递增收到此确认的消息的确认计数器。为此,我需要通过检查队列中每条消息的特定字段(发送时间)来查找消息。
如何做到这一点?我想到了以下几点:
获取迭代器,然后遍历队列,检查每个对象的特定字段。
这对我来说似乎是残酷的方法。有没有更好的方法?我们可以像这样访问队列中的对象吗?
注意:我需要使用PriorityQueue,因为我正在实现的功能(使用Lamport逻辑时钟的分布式系统中的有序组播总数)需要有一个有序队列。如果每个节点都没有确认,我无法将队列头部的消息传递给应用程序线程。此外,即使已收到所有确认,我也无法传递不在队列头部的消息。
答案 0 :(得分:1)
首先:是的,我们可以通过这种方式访问PriorityQueue
,因为它正在实施Iterable
- 界面。
当您考虑性能问题时,可以通过使用某种轴来记录复杂性(请参阅Quicksort
)。
如果你发现它有些愚蠢:最好的解决方案在某种程度上是愚蠢的,但大多数工作正常。
答案 1 :(得分:0)
听起来我正在使用错误类型的数据结构。如果您正在从队列(即JMS或类似程序)接收消息,那么为什么不从队列中读取消息并将数据存储到更合适的数据结构中,如Map(例如HashMap)或数据库(如果需要持久性)。
收到确认后,您可以在地图中查找相应的对象并更新计数。如果您需要,地图可能会有更快的随机访问权。
如果您递增确认计数并且达到“我现在收到所有确认”的阈值,那么您可以将消息推送到新队列以进行进一步处理(如果这是您想要的)。
有些值得深思。希望我能正确地解释你的问题。