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

java-生产者-消费者模式完成信号,java,design-patterns,Java,Design Patterns,我有一个应用程序,它应用了生产者-消费者设计模式。它是用java编写的。简言之,生产者将商品放入阻塞队列,消费者将商品从那里带走。消费者应一直运行,直到生产商发出停止的信号 从生产者向消费者传递这一信号的最简洁的方式是什么?首席设计师说他想将生产者和消费者分开,但除了调用消费者线程池上的方法之外,我看不到其他方法了。通过队列发送取消消息。您的消费者的运行方法 while(true) { Message message = queue.take(); if(message == M

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


从生产者向消费者传递这一信号的最简洁的方式是什么?首席设计师说他想将生产者和消费者分开,但除了调用消费者线程池上的方法之外,我看不到其他方法了。

通过队列发送取消消息。您的消费者的
运行方法

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

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

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


如果存在多个使用者(您提到的ThreadPool)或有界队列,这可能会很棘手。请在Joshua Bloch的《Java并发实践》中查找这一点。他解释得最好。

创建一个ConsumerAlter类。将所有希望从队列获取数据的使用者注册到ConsumerAlter类,并让生产者在ConsumerAlther类中触发停止事件。然后ConsumerAlter类调用每个使用者的onStopConsuming()