我目前正在研究并发编程模式。考虑使用信号量的有界缓冲区生成器消费者问题的解决方案,在wikipedia上提供。
如果在某个时候制片人说:这是我正在制作的最后一项。我怎么能让程序终止?(消费者仍然会等到它被告知缓冲区中有东西)。
同样,如果消费者说:我不想再消费了。如何通知制作人,以便程序退出? (制作人正在等待有一个可用的地点放一些东西)。
答案 0 :(得分: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
答案 1 :(得分:2)
您可以让生产者通过在队列中放置有害消息来终止消费者,当消费者收到消息时,它会识别消息是生产者关闭的消息,并相应地自行关闭。
在给定方案中,消费者与生产者之间的沟通是不可能的,您将不得不创建另一个沟通渠道,因为沟通目前只有一种方式。
您可以使用Exchanger实例进行直接(无队列)通信,然后可以双向传递有害消息,但您现在拥有直接链接的进程对而不是独立的生产者/消费者对。
最后,您可以向一个经理注册所有生产者和消费者,他们都有一个参考,任何生产者/消费者都可以请求关闭,设置一个标志,然后全部检查标志,或者回复InterruptedException和管理器向每个中断发送一个中断。