我正在使用带有优先级字段的PriorityBlockingQueue
。在我的测试中,我使用System#currentTime()
作为优先级 - 计算机获得的相同优先级非常快,以至于毫秒相同(或更像是PC上的毫秒有误差)。
当优先级相同时,队列就像堆栈一样,这看起来很奇怪。当元素的优先级相同时,是否有一种替代方法可以使队列充当普通队列(即FIFO而不是LIFO行为)?
答案 0 :(得分:11)
此类的操作不保证具有相同优先级的元素的排序。如果需要强制执行排序,则可以定义使用辅助键来断开主要优先级值中的关系的自定义类或比较器。
PriorityBlockingQueue
文档themselves会告诉您这一点,以及如果您需要,如何解决这个问题。
答案 1 :(得分:2)
我不认为优先级队列保证获得相等元素的顺序。一种选择是使优先级更复杂 - 在推送元素及其优先级时推动队列大小的负数,并将这些值与相等优先级元素进行比较。
答案 2 :(得分:1)
只需使用您自己的Comparator创建PriorityBlockingQueue,并将创建时间考虑在内(请参阅http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html#PriorityBlockingQueue(int, java.util.Comparator))。 您可能必须将密钥从简单的Date更改为Date和counter类,其中后者将在每次创建时全局递增(新密钥类的静态字段);它不是真正的先进先出,而是首先创造出来的。
或者,只需实现自己的PriorityQueueFifo类。
答案 3 :(得分:0)
另一个解决方案是在测试中维护一个用于优先级的计数器,并在每次插入时增加。这样,您的优先级队列将在您的测试中具有FIFO排序,但它看起来像任意优先级队列。