我有PriorityBlockingQueue
如下:
BlockingQueue<Robble> robbleListQueue = new PriorityBlockingQueue<Robble>();
Robble
实现了Comparable<Robble>
,我可以毫无问题地对列表进行排序,因此我知道我的比较有效。
我还有以下Runnable:
private class RobbleGeneratorRunnable implements Runnable {
private final BlockingQueue<Robble> robbleQueue;
public RobbleGeneratorRunnable(BlockingQueue<ResultList> robbleQueue) {
this.robbleQueue = robbleQueue;
}
@Override
public void run() {
try {
robbleQueue.put(generateRobble());
} catch (InterruptedException e) {
// ...
}
}
private Robble generateRobble() {
// ...
}
}
我将几千个这样的runnables推送到ExecutorService
然后shutdown()
和awaitTermination()
。
根据BlockingQueue
JavaDoc,put(...)
是阻止操作。但是,当我遍历队列中的项目时,它们只是按顺序排列 - 有一些是无序的,这表明队列没有正确阻塞。就像我之前说过的那样,我可以对Robble
进行排序。
什么可能导致robbleQueue.put(generateRobble())
无法正常阻止?
答案 0 :(得分:4)
根据javadoc,
不保证方法iterator()中提供的迭代器 以任何特定顺序遍历优先级队列的元素。 如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())
添加,查看,轮询和删除是按优先顺序操作所必需的,但不是迭代器。
答案 1 :(得分:2)
PriorityBlockingQueue是一个无界的队列,如果你读了put()的javadocs,它就说明了:
将指定的元素插入此优先级队列。作为队列 这种方法永远不会阻止。
为什么你会期望put()被阻止?
答案 2 :(得分:1)
在Javadoc中明确声明了PriorityQueue
或PriorityBlockingQueue
的无法排序。仅订购了add()
,peek()
,poll()
和remove()
。这与阻塞是否正确发生无关。