PriorityBlockingQueue没有阻塞?

时间:2012-03-08 04:37:20

标签: java concurrency queue blocking

我有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())无法正常阻止?

3 个答案:

答案 0 :(得分:4)

根据javadoc,

  

不保证方法iterator()中提供的迭代器   以任何特定顺序遍历优先级队列的元素。   如果您需要有序遍历,请考虑使用   Arrays.sort(pq.toArray())

添加,查看,轮询和删除是按优先顺序操作所必需的,但不是迭代器。

答案 1 :(得分:2)

PriorityBlockingQueue是一个无界的队列,如果你读了put()的javadocs,它就说明了:

  

将指定的元素插入此优先级队列。作为队列   这种方法永远不会阻止。

为什么你会期望put()被阻止?

答案 2 :(得分:1)

在Javadoc中明确声明了PriorityQueuePriorityBlockingQueue的无法排序。仅订购了add()peek()poll()remove()。这与阻塞是否正确发生无关。