Java 优先阻塞队列未阻塞?

Java 优先阻塞队列未阻塞?,java,concurrency,queue,blocking,Java,Concurrency,Queue,Blocking,我有一个PriorityBlockingQueue,如下所示: BlockingQueue<Robble> robbleListQueue = new PriorityBlockingQueue<Robble>(); 我将几千个这样的可运行程序推送到Executor服务中,然后关闭并等待终止 根据BlockingQueue JavaDoc,将。。。这是一个阻塞动作。但是,当我迭代队列中的项目时,它们基本上是有序的——有一些是无序的,这向我表明队列没有正确阻塞。就像我之前

我有一个PriorityBlockingQueue,如下所示:

BlockingQueue<Robble> robbleListQueue = new PriorityBlockingQueue<Robble>();
我将几千个这样的可运行程序推送到Executor服务中,然后关闭并等待终止

根据BlockingQueue JavaDoc,将。。。这是一个阻塞动作。但是,当我迭代队列中的项目时,它们基本上是有序的——有一些是无序的,这向我表明队列没有正确阻塞。就像我之前说的那样,我能把Robbles分类得很好


是什么原因导致robbleQueue.putgenerateRobble无法正确阻止?

PriorityBlockingQueue是一个无界队列,如果您阅读javadocs以了解put状态:

将指定的元素插入此优先级队列。排队 是无界的。这个方法永远不会阻塞


为什么希望put阻塞?

迭代PriorityQueue或PriorityBlockingQueue在Javadoc中明确规定不排序。仅订购添加、查看、轮询和删除。这与阻塞是否正确发生无关。

根据javadoc

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


Add、peek、poll和remove需要按优先级顺序操作,但迭代器不需要。

请参阅上的表。在“块”列中输入。这不是违反了实现BlockingQueue接口的合同吗?从您链接的页面上看:BlockingQueue可能是容量受限的。在任何给定的时间,它都可能有一个剩余容量,超过这个容量,就不能不阻塞地放置额外的元件。没有任何内在容量约束的BlockingQueue始终报告Integer.MAX_值的剩余容量。但是,如果您仔细阅读,它会清楚地表明这不会阻塞。@BobI这只适用于容量受限的实现,这是可选的。PriorityBlockingQueue被显式声明为无界。我实际上不确定您的问题是为什么这个阻塞不存在,或者为什么迭代器的顺序不正确。如果这是为什么不阻塞,我的答案应该解决这个问题。如果你问的是后者,那么Jim Garrison和EJP都有有效的回答。
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() {
        // ...
    }
}