Подтвердить что ты не робот

Очередь в полном объеме, На глубине блокирующей очереди необходимо уточнение

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

    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
  ...

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Из Javadoc:

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

Ответ 3

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