2013-03-21 206 views
3

我目前正在学习并发编程模式。考虑用wikipedia提供的使用信号量的有界缓冲区的生产者消费者问题的解决方案。生产者消费终止

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

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

+0

给消费者提供生产者参考,反之亦然。 – 2013-03-21 16:52:45

回答

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

+0

有了这个解决方案,很容易看出生产者如何告诉消费者停止,但相反呢? – 2013-03-21 17:02:37

+0

正是。如果消费者停止接受,而生产者不知道等待消费者接受呢? – user1377000 2013-03-21 17:22:00

+0

如何使用显示器...? – user1377000 2013-03-21 18:47:41

2

您可以制作者通过在队列中放置一个带毒邮件,当终止消费消费者接收到它认识到消息是生产者关闭的消息,并相应地关闭它。

在特定情况下消费者与生产者之间的沟通是不可能的,您将不得不建立另一个沟通渠道,因为沟通目前只有一种方式。

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

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