Очередь заполнена, на глубине очереди блокировки требуется уточнение - PullRequest
13 голосов
/ 05 февраля 2012

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

    BlockingQueue<String> q = new SynchronousQueue<String>();
            ...
        fstream = new FileInputStream("/path/to/file.txt");
            ...
        while ((line = br.readLine()) != null) {
            if (q.offer(line))
                System.out.println("Depth: " + q.size()); //0
        }

При замене offer на add,исключение если выброшено

Exception in thread "main" java.lang.IllegalStateException: Queue full
  ...

Что я делаю не так, пожалуйста?Почему очередь заполнена сразу после вставки первого элемента?

Ответы [ 3 ]

17 голосов
/ 05 февраля 2012

Проверьте документацию для SynchronousQueue:

Очередь блокирования, в которой каждый пут должен ждать дубля, и наоборот. Синхронная очередь не имеет внутренней емкости, даже емкости одной . Вы не можете заглянуть в синхронную очередь, потому что элемент присутствует только при попытке его получить; вы не можете добавить элемент (используя любой метод), если другой поток не пытается удалить его ; Вы не можете повторять, так как нечего повторять. Голова очереди - это элемент, который первый поток в очереди пытается добавить в очередь; если нет потоков в очереди, то ни один элемент не добавляется и заголовок равен нулю. Для целей других методов Collection (например, содержит) SynchronousQueue действует как пустая коллекция. Эта очередь не разрешает нулевые элементы.

Вам нужно настроить потребителей и ждать, прежде чем вы сможете попытаться добавить в очередь.

Метод offer ничего не делает, если нет потребителей:

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

2 голосов
/ 05 февраля 2012

Из Javadoc:

. Блокирующая очередь, в которой каждый пут должен ждать принятия, и наоборот. Синхронная очередь не имеет внутренней емкости, даже емкости одной

1 голос
/ 09 октября 2013

Вы можете использовать ArrayBlockingQueue.Это ограниченная очередь блокировки, поддерживаемая массивом.Эта очередь упорядочивает элементы FIFO (первым пришел-первым вышел).ArrayBlockingQueue - классический «ограниченный буфер», в котором массив фиксированного размера содержит элементы, вставленные производителями и извлеченные потребителями.http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (для тех, кто тоже наступил на грабли)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...