2013-03-21 252 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並且管理器向它們中的每一個發送中斷。