生產(chǎn)者消費(fèi)者設(shè)計圖案是一個經(jīng)典的并發(fā)或線程模式這降低之間的耦合
生產(chǎn)者和消費(fèi)者通過與執(zhí)行工作離作業(yè)的鑒定。在生產(chǎn)者的消費(fèi)者設(shè)計模式共享隊列是用來控制流和這種分離允許你單獨(dú)編碼生產(chǎn)者和消費(fèi)者。它還涉及不同的時序問題需要生產(chǎn)項(xiàng)目或消費(fèi)項(xiàng)目。用制片人的消費(fèi)模式既是生產(chǎn)者又是消費(fèi)者線程可以用不同的轉(zhuǎn)速下工作。在這篇文章中,我們將看到什么是生產(chǎn)者消費(fèi)者問題,這是非常流行的多線程的面試問題,如何使用阻塞隊列和生產(chǎn)者利用消費(fèi)者設(shè)計模式的優(yōu)點(diǎn)來解決生產(chǎn)者消費(fèi)者問題。
生產(chǎn)者消費(fèi)者設(shè)計模式的現(xiàn)實(shí)世界的例子
生產(chǎn)者消費(fèi)者模式是在現(xiàn)實(shí)生活中的每一個地方和描繪的協(xié)調(diào)和合作。就像一個人準(zhǔn)備食物(監(jiān)制),而另一種是提供食品(消費(fèi)者),都將使用共享的表為把食品盤子和進(jìn)食板。制片人是準(zhǔn)備食物會等待,如果這個人表已滿和消費(fèi)者(人誰是服務(wù)食品)會等待,如果表是空的。表是一個共享這里對象。在Java庫執(zhí)行人框架本身實(shí)現(xiàn)生產(chǎn)者消費(fèi)者設(shè)計模式來分離添加和任務(wù)的執(zhí)行的責(zé)任。
生產(chǎn)者消費(fèi)者模式的好處
它的確是一個有用的設(shè)計模式,并同時編寫多線程并發(fā)或代碼最為常用。這里
少其好處:
1)生產(chǎn)者消費(fèi)者模式簡單的開發(fā)。您可以獨(dú)立或并行代碼生產(chǎn)者和消費(fèi)者,他們只需要知道共享對象。
2)生產(chǎn)者并不需要知道誰是消費(fèi)者還是多少消費(fèi)者那里。同樣是消費(fèi)者真實(shí)的。
3)生產(chǎn)者和消費(fèi)者可以用不同的轉(zhuǎn)速下工作。沒有消費(fèi)半生不熟的項(xiàng)目消費(fèi)者的風(fēng)險。
事實(shí)上通過監(jiān)控用戶的速度可以更好地利用引進(jìn)更多的消費(fèi)者。
4)分離生產(chǎn)者和消費(fèi)者的功能結(jié)果在更清潔的,可讀和可管理的代碼。
### 生產(chǎn)者消費(fèi)者問題在多線程
生產(chǎn)者-消費(fèi)者問題是一個LSO一個流行的Java面試問題,其中面試官問到落實(shí)生產(chǎn)者消費(fèi)者設(shè)計模式,使生產(chǎn)者應(yīng)等待,如果隊列或桶滿和消費(fèi)者應(yīng)該等待,如果隊列或
桶是空的。這個問題可以實(shí)現(xiàn)或Java中不同的方式解決的,經(jīng)典的方法是使用wait和notify方法之間的溝通生產(chǎn)者和消費(fèi)者線程和阻止他們每個人喜歡上隊列滿和空隊列個別情況。隨著引進(jìn)的BlockingQueue在Java中的數(shù)據(jù)結(jié)構(gòu)5它現(xiàn)在簡單得多,因?yàn)锽lockingQueue的引入隱式地提供這種控制封鎖方式把(),并采?。ǎ,F(xiàn)在你不需要使用的等待,并通知生產(chǎn)者和消費(fèi)者之間的溝通。的BlockingQueue put()方法將阻塞如果隊列是滿有界隊列的情況下,采?。ǎ⒆柚谷绻犃惺强盏摹T谙乱还?jié)我們將看到一個生產(chǎn)者消費(fèi)者設(shè)計模式的代碼示例。
使用阻塞隊列來實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式
BlockingQueue的驚人提供outofbox支持阻塞放的簡化了實(shí)施生產(chǎn)者-消費(fèi)者設(shè)計模式(),并采?。ǎi_發(fā)者不需要寫混亂和關(guān)鍵件的等待,通知代碼來實(shí)現(xiàn)通信。BlockingQuue是一個接口和Java 5提供了不同的植入等ArrayBlockingQueue和的LinkedBlockingQueue,都實(shí)現(xiàn)FIFO的順序或元件,而ArrayLinkedQueue被在性質(zhì)上有界的LinkedBlockingQueue任選限定。這里是一個完整的生產(chǎn)消費(fèi)模式的代碼示例與BlockingQueue的。與經(jīng)典的比較它等待通知代碼,它更簡單,易于理解。




你看生產(chǎn)者線程生產(chǎn)數(shù)量和消費(fèi)線程消耗它以FIFO的順序,因?yàn)樽枞犃性试SFIFO被訪問的元素。
這是所有關(guān)于如何使用阻塞隊列來解決生產(chǎn)者消費(fèi)者問題或例如生產(chǎn)者消費(fèi)者設(shè)計模式。我相信它遠(yuǎn)比等待通知的例子,但與這兩個如果你要對任何Java面試的面試可能會問你兩個方法準(zhǔn)備好。
參考文獻(xiàn)
聊聊并發(fā)——生產(chǎn)者消費(fèi)者模式
http://www.infoq.com/cn/articles/producers-and-consumers-mode/#