首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java1.5 BlockingQueue为多个使用者创建停止条件?

如何使用Java1.5 BlockingQueue为多个使用者创建停止条件?
EN

Stack Overflow用户
提问于 2010-11-09 00:24:41
回答 2查看 455关注 0票数 2

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

代码语言:javascript
复制
while(true) {
    MyQueueableObject o = queue.take() ;
    if ( o.type==PRODUCER_DONE_SIGNAL ) {
        return() ;
    }
    process ( o ) ;
}

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

代码语言:javascript
复制
while(true) {
    while ( ... stop condition not detected ... ) {
        process ( queue.take()  ) ;
    }
    return ;
}

我已经详细考虑过这一点,我能想到的所有停止条件都涉及生产者线程的状态和队列的状态。两者看起来都不必要地复杂且容易出错。更糟糕的是,这种方法看起来像是一颗定时炸弹。在检查停止条件并获取false之后,在尝试从队列中获取某些内容之前,使用者线程可能会中断。在该中断期间,其他消费者可以清空队列。在这种情况下,队列将永远阻塞线程。

如何使用Java1.5 BlockingQueue为多个使用者创建停止条件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-09 01:16:41

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

票数 2
EN

Stack Overflow用户

发布于 2010-11-09 00:28:44

如果多次输入PRODUCER_DONE_SIGNAL,等于生产者的数量,该如何处理呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4125760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档