3

我目前正在研究并发编程模式。考虑使用信号量解决生产者消费者问题的有界缓冲区,见维基百科

如果,在某个时候,制片人说:这是我制作的最后一件作品。我怎样才能让程序终止?(消费者仍然会等到它被告知缓冲区中有东西)。

同样,如果消费者说:我不想再消费了。如何通知生产者,让程序退出?(生产者正在等待有一个可用的位置来放置一些东西)。

4

2 回答 2

4

来自Java Concurrency in Practice Book 7.2.3

Another way to convince a producer consumer service to shut down is with a poison pill: a recognizable object placed on the queue that means "when you get this, stop."

翻阅本书的第 7 章Cancellation and Shutdown

于 2013-03-21T16:54:24.107 回答
2

您可以通过在队列中放置有害消息来让生产者终止消费者,当消费者收到消息时,它会识别出消息是来自生产者的关闭,并相应地关闭自己。

在给定的场景中,从消费者到生产者的通信是不可能的,您必须创建另一个通信渠道,因为目前通信只是一种方式。

您可以使用 Exchanger 实例进行直接(无队列)通信,然后可以双向传递有害消息,尽管您现在有一个直接链接的进程对而不是独立的生产者/消费者对。

最后,您可以向单个管理器注册所有生产者和消费者,他们都有引用,任何生产者/消费者都可以请求关闭,设置一个标志,然后全部检查标志,或响应 InterruptedException 和manager 向他们每个人发送一个中断。

于 2013-03-21T16:55:38.337 回答