«Закрытие» блокирующей очереди

Я использую 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 не так просто поместить «ядовитый объект» в очередь. Так что эта «обычная тактика» не совсем удобна в моем сценарии.

Мой вопрос: какие еще хорошие тактики / шаблоны я могу использовать для «закрытия» очереди?

Спасибо!

27
задан Lachezar Balev 21 March 2011 в 13:41
поделиться