Я использую 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 очереди блокировки я прочитал:
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 очереди блокировки я прочитал:
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 очереди блокировки я прочитал:
BlockingQueue по своей сути не поддерживать любые "близкие" или операция "выключение", чтобы указать, что больше ничего не будет добавлено. Нужды и использование таких функций обычно зависит от реализации. Например, распространенная тактика для производителей - вставить специальный конец потока или яд объекты, которые интерпретируются соответственно, когда они принимаются потребителями.
К сожалению, из-за используемых универсальных шаблонов и природы ComplexObject не так просто поместить «ядовитый объект» в очередь. Так что эта «обычная тактика» не совсем удобна в моем сценарии.
Мой вопрос: какие еще хорошие тактики / шаблоны я могу использовать для «закрытия» очереди?
Спасибо!