1

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

将这个信号从生产者传递给消费者的最佳方式是什么?首席设计师说他想让生产者和消费者分开,但我没有看到除了在消费者线程池上调用方法之外的任何其他方法?

4

3 回答 3

2

首席程序员是对的。将它们分开会导致高度解耦的代码非常好。

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

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

于 2013-05-13T02:45:41.230 回答
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;
    }
}
于 2013-05-13T02:44:10.217 回答
0

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

于 2013-05-13T02:55:02.053 回答