如何使用Java 1.5 BlockingQueue为多个消费者设置停止条件?

时间:2010-11-08 16:24:41

标签: java concurrency

对于单个生产者 - 消费者安排,生产者将“完成信号”作为队列中的最后一项。 消费者检查从队列中取出的每个对象,并在完成信号出列时关闭。

while(true) {
    MyQueueableObject o = queue.take() ;
    if ( o.type==PRODUCER_DONE_SIGNAL ) {
        return() ;
    }
    process ( o ) ;
}

但是,这仅适用于单个生产者 - 消费者。因为BlockingQueue会阻止 take()调用直到队列中有东西,在我看来,在多个消费者设计中 应该有另一个嵌套循环来检查一些停止条件。

while(true) {
    while ( ... stop condition not detected ... ) {
        process ( queue.take()  ) ;
    }
    return ;
}

我已经仔细考虑了这一点,我能提出的所有停止条件都涉及到状态 生产者线程和队列的状态。两者似乎都不必要地复杂且容易出错。 更糟糕的是,这种方法似乎是一颗定时炸弹。检查停止条件后,可能会中断消费者线程 在尝试从队列中取出某些东西之前得到错误。在那个中断期间其他消费者 可能已经清空了队列。在这种情况下,队列将永远阻止该线程。

如何使用Java 1.5 BlockingQueue为多个消费者设定停止条件?

2 个答案:

答案 0 :(得分:2)

在阅读PRODUCER_DONE_SIGNAL后,每个消费者都可以将其重新添加回队列以供下一个消费者使用。但是,我还会考虑使用队列外部的条件(例如Condition对象):这样即使队列仍然包含空(例如,如果您希望立即关闭),也可以提前终止线程。

答案 1 :(得分:0)

如何多次喂食PRODUCER_DONE_SIGNAL,等于生产者的数量?