对于单个生产者 - 消费者安排,生产者将“完成信号”作为队列中的最后一项。 消费者检查从队列中取出的每个对象,并在完成信号出列时关闭。
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为多个消费者设定停止条件?
答案 0 :(得分:2)
在阅读PRODUCER_DONE_SIGNAL后,每个消费者都可以将其重新添加回队列以供下一个消费者使用。但是,我还会考虑使用队列外部的条件(例如Condition对象):这样即使队列仍然包含空(例如,如果您希望立即关闭),也可以提前终止线程。
答案 1 :(得分:0)
如何多次喂食PRODUCER_DONE_SIGNAL,等于生产者的数量?