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

Java BlockingQueue take() vs poll()

При потреблении значений из очереди в бесконечном цикле - что было бы более эффективно:

1) Блокировка в очереди, пока значение не будет доступно с помощью команды take()

while (value = queue.take()) { doSomething(value); }

2) Спящий режим за миллисекунды и проверка наличия элемента

while (true) {

    if ((value = queue.poll()) != null) { doSomething(value); }

    Thread.sleep(1000);
}
4b9b3361

Ответ 1

Блокировка, вероятно, более эффективна. В фоновом режиме поток, который изначально вызывает take(), переходит в режим сна, если нет доступного элемента, позволяя другим потокам делать все, что им нужно. Затем методы, добавляющие элементы в очередь, будут запускать ожидающие потоки при добавлении элемента, поэтому минимальное время тратится на проверку очереди снова и снова, независимо от того, доступен ли элемент.

Ответ 2

Будьте внимательны при использовании take(). Если вы используете take() из службы, а служба имеет соединение db.

Если take() возвращается после периода ожидания устаревшего соединения, тогда он выдает исключение Stale connection.

Используйте опрос для предопределенного времени ожидания и добавьте нулевую проверку для возвращаемого объекта.