gpt4 book ai didi

java - 您如何使用 Java 1.5 BlockingQueue 为多个消费者设计停止条件?

转载 作者:行者123 更新时间:2023-11-30 09:52:50 24 4
gpt4 key购买 nike

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

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 为多个消费者设计停止条件?

最佳答案

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

关于java - 您如何使用 Java 1.5 BlockingQueue 为多个消费者设计停止条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4125760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com