我有一个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() {
// ...
}
}
我将其中数千个可运行对象放入
ExecutorService
,然后放入shutdown()
和awaitTermination()
。根据
BlockingQueue
JavaDoc,put(...)
是一种阻止操作。但是,当我遍历队列中的项目时,它们基本上仅是按顺序排列的-有一些不按顺序排列,这向我表明队列未正确阻塞。就像我之前说过的,我可以对Robble
进行排序。是什么导致
robbleQueue.put(generateRobble())
无法正常阻止? 最佳答案
Javadoc中明确声明了对PriorityQueue
或PriorityBlockingQueue
进行迭代,而不要对其进行排序。仅排序add()
,peek()
,poll()
和remove()
。这与阻塞是否正确发生无关。