0

我需要使用 aPriorityQueue来对 FIFO 元素进行排序。该队列将包含一个 Message 对象,每个对象都将具有一个double timestamp以及一个int counter跟踪该消息已收到多少确认的消息。有两种类型的消息 - 带有数据的消息和带有确认消息的消息。只有带有数据的消息才能放入队列中。我正在编写一个比较器,用于对队列进行排序。只有当它收到所有确认时,我才会弹出队列的头部。

问题是,当收到确认消息时,我需要增加收到此确认的消息的确认计数器。为此,我需要通过检查队列中每条消息的特定字段(发送时间)来查找消息。

如何才能做到这一点?我想到了以下几点:

获取一个迭代器,然后遍历队列检查每个对象的特定字段。

不过,这对我来说似乎是一种残酷的方法。有没有更好的办法?我们可以像这样访问队列中的对象吗?


注意:我需要使用 PriorityQueue 因为我正在实现的功能(使用 Lamport 的逻辑时钟在分布式系统中的总有序多播)需要有一个有序队列。如果没有得到每个节点的确认,我无法将队列头部的消息传递给应用程序线程。此外,即使它已收到所有确认,我也无法传递不在队列头部的消息。

4

2 回答 2

1

第一:是的,我们可以通过PriorityQueue这种方式访问​​,因为它实现了Iterable-interface。

当您想到性能问题时,您可以通过使用某种枢轴来记录复杂性(请参阅 参考资料Quicksort)。

如果你觉得它有点愚蠢:最好的解决方案有点愚蠢,但大部分都可以正常工作。

于 2013-03-18T21:18:55.870 回答
0

在我看来,您使用的数据结构类型错误。如果您从队列(即 JMS 或类似)接收消息,那么如果您需要持久性,为什么不从队列中读取消息并将数据存储到更合适的数据结构中,例如 Map(例如 HashMap)或数据库。

收到确认后,您可以在 Map 中查找相应的对象并更新计数。如果您需要,地图可能具有更快的随机访问。

如果您增加确认计数并达到“我现在已收到所有确认”的阈值,那么您可以将消息推送到新队列以进行进一步处理(如果这是您想要的)。

一些值得深思的食物。希望我正确地解释了你的问题。

于 2013-03-18T21:32:24.513 回答