PriorityBlockingQueue не блокирует? - PullRequest
0 голосов
/ 08 марта 2012

У меня есть 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() {
        // ...
    }
}

Я помещаю несколько тысяч этих runnable в ExecutorService, а затем shutdown() и awaitTermination().

Согласно BlockingQueue JavaDoc, put(...) является блокирующим действием.Однако, когда я перебираю элементы в очереди, они в основном только в порядке - есть некоторые, которые не в порядке, что указывает мне, что очередь не блокируется должным образом.Как я уже говорил ранее, я могу нормально отсортировать Robble.

Что может быть причиной того, что robbleQueue.put(generateRobble()) не блокируется должным образом?

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

Согласно javadoc,

Итератор, предоставленный в методе iterator (), не гарантирует прохождение элементов очереди с приоритетами в любом конкретном порядке.Если вам нужен упорядоченный обход, рассмотрите возможность использования Arrays.sort (pq.toArray ())

Операции добавления, просмотра, опроса и удаления необходимы для работы в приоритетной последовательности, но НЕ для итератора.

2 голосов
/ 08 марта 2012

PriorityBlockingQueue является неограниченной очередью, и если вы читаете javadocs для put (), он сообщает:

Вставляет указанный элемент в эту очередь приоритетов.Поскольку очередь не ограничена, этот метод никогда не заблокируется.

Почему вы ожидаете, что put () будет блокировать?

1 голос
/ 08 марта 2012

Итерация PriorityQueue или PriorityBlockingQueue прямо указана в Javadoc, чтобы не заказывать.Заказываются только add(), peek(), poll() и remove().Это не имеет никакого отношения к тому, правильно ли происходит блокировка.

...