生产者消费者终止

3
我正在学习并发编程模式。考虑使用信号量解决有界缓冲区的生产者消费者问题,该解决方案在wikipedia上介绍。
如果生产者在某个时刻说:“这是我制作的最后一个项目”,那么如何使程序终止?(消费者仍将等待直到被告知缓冲区中有内容)。
同样地,如果消费者说:“我不想再消耗了”,生产者如何被通知,以便程序退出?(生产者正在等待有可用位置放置东西)。

提供生产者和消费者之间的引用。 - Sotirios Delimanolis
2个回答

4

来自《Java并发实战》第7.2.3章节

另一种说服生产者消费者服务停止的方法是使用毒丸(Poison Pill):将一个可识别的对象放置在队列上,表示“当你接收到这个对象时,请停止运行。”

请查阅本书第7章“取消操作和关闭”Cancellation and Shutdown


1
通过这个解决方案,我们很容易看出生产者如何告诉消费者停止,但相反的情况呢? - Sotirios Delimanolis
没错。如果消费者停止接受,生产者不知道并等待消费者接受的话,会怎样? - user1377000
使用监视器怎么样? - user1377000

2
当生产者在队列中放置一个毒消息时,您可以让生产者终止消费者。当消费者收到来自生产者的消息时,它会识别该消息是来自生产者的关闭信号,并相应地关闭自己。
在给定的场景中,从消费者到生产者的通信是不可能的。您需要创建另一个通信渠道,因为当前通信是单向的。
您可以使用Exchanger实例进行直接(无队列)通信,然后毒消息可以双向传递,但现在您有了直接链接的进程对,而不是独立的生产者/消费者对。
最后,您可以将所有生产者和消费者注册到一个单一的管理器中,他们都有一个引用。任何生产者/消费者都可以请求关闭,这将设置一个标志,然后所有人都检查标志,或响应InterruptedException,管理器向每个人发送中断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接