首页 文章

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

提问于
浏览
2

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

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 回答

  • 2

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

  • 0

    怎么样多次喂食PRODUCER_DONE_SIGNAL,等于 生产环境 者的数量?

相关问题