Im, используя java.util.concurrent.BlockingQueue в очень простом сценарии производителя и потребителя. Например. этот псевдо-код изображает потребительскую часть:
class QueueConsumer implements Runnable {
@Override
public void run() {
while(true)
{
try {
ComplexObject complexObject = myBlockingQueue.take();
//do something with the complex object
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
Пока все хорошо. В javadoc блокирующей очереди я читал:
A BlockingQueue не является внутренне поддерживать любые "близкие" или "выключение", чтобы указать, что больше предметов не будет добавлено. Нужды и использование таких функций, как правило, зависит от реализации. Например, общая тактика заключается в том, что производители вставить специальный конец потока или яд объекты, которые интерпретируются соответственно, когда их принимают потребители.
К сожалению, из-за использования дженериков и характера ComplexObject его нетривиально, чтобы вставить "ядовитый объект" в очередь. Так что эта "общая тактика" в моем сценарии не очень удобна.
Мой вопрос: какие еще хорошие тактики/шаблоны я могу использовать для "закрытия" очереди?
Спасибо!