Рассмотрим следующий фрагмент. qIn
- это BlockingQueue
, LinkedBlockingQueue
реализация
while (true) {
try {
// retrieved = qIn.poll(999, TimeUnit.MILLISECONDS); works
retrieved = qIn.poll(); // fails
if (retrieved != null)
consume(retrieved);
if (!Producer.isAddingData && qIn.size() == 0)
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Позвольте мне уточнить, что я имею в виду под works
и fails
. Когда я говорю, что qIn.poll()
терпит неудачу, я имею в виду тот факт, что иногда не все данные в очереди обрабатываются.
Почему это ожидание (qIn.poll(999, TimeUnit.MILLISECONDS)
необходимо
retrieved = qIn.poll(999, TimeUnit.MILLISECONDS); // works
retrieved = qIn.poll(); // fails
Когда всегда выполняется следующая проверка? По сути, проверка "Если ваш производитель больше не добавляет данные, а очередь для извлечения не содержит данных, прервите "
if (!StopwordsFilter.isAddingData && qIn.size() == 0)
break;
Интересно, при каких обстоятельствах qIn.poll();
терпит неудачу?
Определяется следующим образом, учитывая, что мы ломаемся только тогда, когда нечего взять, с чего бы это ломаться?
извлекает и удаляет заголовок этой очереди или возвращает ноль, если это
очередь пуста.
PS: я должен добавить, что qIn.poll()
иногда дает сбой, а не постоянно