У меня есть блокирующая очередь объектов.java BlockingQueue не имеет блокировки заглянуть?
Я хочу написать поток, который блокируется до тех пор, пока в очереди не будет объекта. Подобно функциональности, предоставляемой BlockingQueue.take().
Однако, поскольку я не знаю, смогу ли я успешно обработать объект, я хочу просто заглянуть() и не удалить объект. Я хочу удалить объект, только если я успешно обработаю его.
Итак, я хотел бы заблокировать функцию peek(). В настоящее время peek() просто возвращает, если очередь пуста в соответствии с javadocs.
Я что-то упустил? Есть ли другой способ достичь этой функциональности?
EDIT:
Любых мысли о том, если я использовал только безопасную очередь потоков и заглянул и спал вместо этого?
public void run() {
while (!__exit) {
while (__queue.size() != 0) {
Object o = __queue.peek();
if (o != null) {
if (consume(o) == true) {
__queue.remove();
} else {
Thread.sleep(10000); //need to backoff (60s) and try again
}
}
}
Thread.sleep(1000); //wait 1s for object on queue
}
}
Обратите внимание, что у меня есть только одна потребительская нить и одна (отдельная) нить производителя. Я думаю, это не так эффективно, как использование BlockingQueue ... Любые комментарии оценены.
Это хорошее предложение. Единственная проблема, которую я вижу здесь, заключается в том, что если очередь заполняется, пока я обрабатываю элемент, то я не буду в очереди возвращать текущий элемент. – rouble
Вы можете обойти это, используя дополнительную синхронизацию в своей реализации обертки, поэтому сделайте операцию take + put атомарной. Вы также можете использовать неограниченную очередь. – Adamski
Я бы рекомендовал не удалять и повторно добавлять, потому что тогда у вас возникли проблемы с отображением изменений состояния очереди в другие потоки. Может быть, использовать занятый опрос для реализации peek(). Или используйте семафор, привязанный к очереди в вашей обертке, если вы не хотите опроса. –