生產(chǎn)者消費(fèi)者設(shè)計模式在Java阻塞隊列實(shí)例

生產(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/#

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 相關(guān)文章Java并發(fā)編程(一)線程定義、狀態(tài)和屬性 Java并發(fā)編程(二)同步Java并發(fā)編程(三)volatil...
    劉望舒閱讀 5,288評論 1 31
  • 生產(chǎn)者消費(fèi)者模式是并發(fā)、多線程編程中經(jīng)典的設(shè)計模式,生產(chǎn)者和消費(fèi)者通過分離的執(zhí)行工作解耦,簡化了開發(fā)模式,生產(chǎn)者和...
    DanDanC閱讀 874評論 0 1
  • 一、多線程 說明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是,通過 New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,849評論 0 44
  • ——那一夜的月似乎拼命地想照的大地更亮一些,似乎比以前的任何一晚都圓。相握的手,似乎異常的溫暖和堅定。不敢忘,忘不...
    野良_9203閱讀 392評論 0 0
  • 1.異化的溝通方式是什么意思? 雖然致力于滿足某種愿望,卻傾向于忽視人的感受和需要,以致彼此的疏遠(yuǎn)和傷害,這些語言...
    cai123閱讀 748評論 0 0

友情鏈接更多精彩內(nèi)容