生產者消費者設計圖案是一個經典的并發或線程模式這降低之間的耦合
生產者和消費者通過與執行工作離作業的鑒定。在生產者的消費者設計模式共享隊列是用來控制流和這種分離允許你單獨編碼生產者和消費者。它還涉及不同的時序問題需要生產項目或消費項目。用制片人的消費模式既是生產者又是消費者線程可以用不同的轉速下工作。在這篇文章中,我們將看到什么是生產者消費者問題,這是非常流行的多線程的面試問題,如何使用阻塞隊列和生產者利用消費者設計模式的優點來解決生產者消費者問題。
生產者消費者設計模式的現實世界的例子
生產者消費者模式是在現實生活中的每一個地方和描繪的協調和合作。就像一個人準備食物(監制),而另一種是提供食品(消費者),都將使用共享的表為把食品盤子和進食板。制片人是準備食物會等待,如果這個人表已滿和消費者(人誰是服務食品)會等待,如果表是空的。表是一個共享這里對象。在Java庫執行人框架本身實現生產者消費者設計模式來分離添加和任務的執行的責任。
生產者消費者模式的好處
它的確是一個有用的設計模式,并同時編寫多線程并發或代碼最為常用。這里
少其好處:
1)生產者消費者模式簡單的開發。您可以獨立或并行代碼生產者和消費者,他們只需要知道共享對象。
2)生產者并不需要知道誰是消費者還是多少消費者那里。同樣是消費者真實的。
3)生產者和消費者可以用不同的轉速下工作。沒有消費半生不熟的項目消費者的風險。
事實上通過監控用戶的速度可以更好地利用引進更多的消費者。
4)分離生產者和消費者的功能結果在更清潔的,可讀和可管理的代碼。
### 生產者消費者問題在多線程
生產者-消費者問題是一個LSO一個流行的Java面試問題,其中面試官問到落實生產者消費者設計模式,使生產者應等待,如果隊列或桶滿和消費者應該等待,如果隊列或
桶是空的。這個問題可以實現或Java中不同的方式解決的,經典的方法是使用wait和notify方法之間的溝通生產者和消費者線程和阻止他們每個人喜歡上隊列滿和空隊列個別情況。隨著引進的BlockingQueue在Java中的數據結構5它現在簡單得多,因為BlockingQueue的引入隱式地提供這種控制封鎖方式把(),并采取()。現在你不需要使用的等待,并通知生產者和消費者之間的溝通。的BlockingQueue put()方法將阻塞如果隊列是滿有界隊列的情況下,采取()將阻止如果隊列是空的。在下一節我們將看到一個生產者消費者設計模式的代碼示例。
使用阻塞隊列來實現生產者消費者模式
BlockingQueue的驚人提供outofbox支持阻塞放的簡化了實施生產者-消費者設計模式(),并采取()。開發者不需要寫混亂和關鍵件的等待,通知代碼來實現通信。BlockingQuue是一個接口和Java 5提供了不同的植入等ArrayBlockingQueue和的LinkedBlockingQueue,都實現FIFO的順序或元件,而ArrayLinkedQueue被在性質上有界的LinkedBlockingQueue任選限定。這里是一個完整的生產消費模式的代碼示例與BlockingQueue的。與經典的比較它等待通知代碼,它更簡單,易于理解。
你看生產者線程生產數量和消費線程消耗它以FIFO的順序,因為阻塞隊列允許FIFO被訪問的元素。
這是所有關于如何使用阻塞隊列來解決生產者消費者問題或例如生產者消費者設計模式。我相信它遠比等待通知的例子,但與這兩個如果你要對任何Java面試的面試可能會問你兩個方法準備好。
參考文獻
聊聊并發——生產者消費者模式
http://www.infoq.com/cn/articles/producers-and-consumers-mode/#