7

我正在使用PriorityBlockingQueue优先级字段。在我的测试中,我使用System#currentTime()了优先级——相同的优先级是通过计算机获得的速度如此之快以至于毫秒是相同的(或者更像是 PC 上的毫秒有误差范围)。

当优先级相同时,队列就好像它是一个堆栈,这看起来很奇怪。当元素的优先级相同时,是否有另一种方法可以使队列像普通队列一样(即 FIFO 而不是 LIFO 行为)?

4

4 回答 4

11

此类上的操作不保证具有相同优先级的元素的顺序。如果您需要强制执行排序,您可以定义自定义类或比较器,它们使用辅助键来打破主要优先级值的关系。

PriorityBlockingQueue文档本身会告诉您这一点,以及如何在需要时解决它。

于 2012-05-02T14:27:05.027 回答
2

我认为优先级队列不能保证获得相等元素的顺序。一种选择是使优先级更复杂 - 在推送元素及其优先级时推送队列大小的负数,并比较这些值以获得相同优先级的元素。

于 2012-05-02T14:27:11.080 回答
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 类。

于 2013-02-18T15:39:03.840 回答
0

另一种解决方案是在您的测试中维护一个用于优先级的计数器,并在每次插入时增加该计数器。这样,您的优先级队列将在您的测试中具有 FIFO 排序,但它看起来像一个任意优先级队列。

于 2014-05-22T14:47:09.940 回答