На LinkedBlockingQueue требуется уточнение - PullRequest
1 голос
/ 07 февраля 2012

Рассмотрим следующий фрагмент. 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() иногда дает сбой, а не постоянно

1 Ответ

1 голос
/ 07 февраля 2012

poll() может вернуть null, потому что информация еще не была добавлена ​​в очередь, вот почему - но, возможно, она может быть добавлена ​​через пару миллисекунд.poll () вообще не ждет .

Если вы хотите подождать ... тогда вам нужно угадать верхнюю границу времени ожидания.Нет действительно хорошего способа предсказать это, но вы, вероятно, можете быть щедрым - если я правильно понимаю ситуацию, вы обычно добавляете вещи в очередь довольно быстро.

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