Очередь в полном объеме, На глубине блокирующей очереди необходимо уточнение
При заполнении очереди из содержимого файла глубина, кажется, никогда не увеличивается, поскольку элементы не добавляются в эту реализацию.
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
...
Что я делаю неправильно? Почему очередь заполняется немедленно, после вставки первого элемента?
Ответы
Ответ 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
(для тех, кто также наступил на рейк)