java - 生产者消费者模式完成信号

时间:2013-05-13 02:39:29

标签: java design-patterns

我有一个应用Producer-Consumer设计模式的应用程序。 IT是用java编写的。简而言之,生产者将物品放入阻塞队列中,消费者从那里取出物品。消费者应该一直运行,直到生产者发出信号停止为止。

从生产者向消费者传递这一信号的最佳方式是什么?首席设计师说他希望保持生产者和消费者的分离,但除了在消费者线程池上调用方法之外我还没有看到任何其他的东西?

3 个答案:

答案 0 :(得分:2)

首席程序员是对的。保持它们分离会导致高度分离的代码,这是非常好的。

有几种方法可以做到这一点。其中一种叫做毒丸。以下是它的工作原理 - 当消费者看到该项目,他们自杀或采取其他行动时,在队列上放置一个已知项目。

如果有多个消费者(你提到过ThreadPool)或有界队列,这可能会很棘手。请在Joshua Bloch的Java Concurrency in Practice中查看。他解释得最好。

答案 1 :(得分:1)

通过队列发送取消消息。您的消费者run方法看起来像

while(true) {
    Message message = queue.take();
    if(message == Message.Cancel) {
        queue.offer(message); // so that the other consumers can read the Cancel message
        break;
    }
}

答案 2 :(得分:0)

创建ConsumerHalter类。将所有想要从队列中获取数据的消费者注册到ConsumerHalter类,并让生产者在ConsumerHalther类中触发暂停事件。然后,ConsumerHalter类调用每个消费者的onStopConsuming()。