我有一个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中明确声明了对PriorityQueuePriorityBlockingQueue进行迭代,而不要对其进行排序。仅排序add()peek()poll()remove()。这与阻塞是否正确发生无关。

09-30 11:53