生產(chǎn)者消費(fèi)者問(wèn)題Java三種實(shí)現(xiàn)_第1頁(yè)
生產(chǎn)者消費(fèi)者問(wèn)題Java三種實(shí)現(xiàn)_第2頁(yè)
生產(chǎn)者消費(fèi)者問(wèn)題Java三種實(shí)現(xiàn)_第3頁(yè)
生產(chǎn)者消費(fèi)者問(wèn)題Java三種實(shí)現(xiàn)_第4頁(yè)
生產(chǎn)者消費(fèi)者問(wèn)題Java三種實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、生產(chǎn)者消費(fèi)者問(wèn)題java三種實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者Java實(shí)現(xiàn)-22011概述生產(chǎn)者消費(fèi)者問(wèn)題是多線程的一個(gè)經(jīng)典問(wèn)題,它描述是有一塊緩沖區(qū)作為倉(cāng)庫(kù),生產(chǎn)者可以將產(chǎn)品放入倉(cāng)庫(kù),消費(fèi)者則可以從倉(cāng)庫(kù)中取走產(chǎn)品。解決生產(chǎn)者/消費(fèi)者問(wèn)題的方法可分為兩類:采用某種機(jī)制保護(hù)生產(chǎn)者和消費(fèi)者之間的同步;在生產(chǎn)者和消費(fèi)者之間建立一個(gè)管道。第一種方式有較高的效率,并且易于實(shí)現(xiàn),代碼的可控制性較好,屬于常用的模式。第二種管道緩沖區(qū)不易控制,被傳輸數(shù)據(jù)對(duì)象不易于封裝等,實(shí)用性不強(qiáng)。在Java中有四種方法支持同步,其中前三個(gè)是同步方法,一個(gè)是管道方法。wait()/notify方法await()/inal法oin阻塞隊(duì)列方法

2、intta/ittta本文只介紹前三種。2實(shí)現(xiàn)2.1wait()/notHy法wait()/nofityd法是基類的兩個(gè)方法:-waitd法:當(dāng)緩沖區(qū)已滿/空時(shí),生產(chǎn)者/消費(fèi)者線程停止自己的執(zhí)行,放棄鎖,使自己處于等等狀態(tài),讓其他線程執(zhí)行。*notify(方法:當(dāng)生產(chǎn)者/消費(fèi)者向緩沖區(qū)放入/取出一個(gè)產(chǎn)品時(shí),向其他等待的線程發(fā)出可執(zhí)行的通知,同時(shí)放棄鎖,使自己處于等待狀態(tài)。緩沖區(qū)toa代碼如下:e.printStackTrace();porjtava.】til.LinkdList;】b:lli:asSstorage/倉(cāng)庫(kù)最大存儲(chǔ)量privaftienalintMAXIZE=100/倉(cāng)庫(kù)存儲(chǔ)的載體

3、privaLteinkedListinl/生產(chǎn)產(chǎn)品p】bvloi:dprod】(Stringprosyn:hron(lizisetd)/如果倉(cāng)庫(kù)已滿whil(leist.si()=MAX_System.otry】t.倉(cāng)庫(kù)已滿(【/由于條件不滿足,生產(chǎn)阻塞list.wait();:at:(hInte】ptedEx:ist();r)E)o】:暫時(shí)不能執(zhí)行生產(chǎn)任務(wù))tione)/生產(chǎn)產(chǎn)品list.add(newObject();System.out.println(”【+producer+】:生產(chǎn)了一個(gè)產(chǎn)品t【現(xiàn)倉(cāng)儲(chǔ)量為】:+list.size();list.notifyAll();/消費(fèi)產(chǎn)品pub

4、licvoidconsume(Stringconsumer)synchronized(list)如果倉(cāng)庫(kù)存儲(chǔ)量不足while(list.size()=0)System.out.println(嗆庫(kù)已空,【+consumer+】:暫時(shí)不能執(zhí)行消費(fèi)任務(wù)!);try/由于條件不滿足,消費(fèi)阻塞list.wait();catch(InterruptedExceptione)e.printStackTrace();list.remove();System.out.println(【+consumer+】:消費(fèi)了一個(gè)產(chǎn)品t【現(xiàn)倉(cāng)儲(chǔ)量為】:+list.size();list.notifyAll();publi

5、cLinkedListgetList()returnlist;publicvoidsetList(LinkedListlist)this.list=list;publicintgetMAX_SIZE()returnMAX_SIZE;ViewCodeTest.javapublicclassTestpublicstaticvoidmain(Stringargs)Storagestorage=newStorage();for(inti=1;i6;i+)intfinalI=i;newThread(newRunnable()Overridepublicvoidrun()duce(String.forma

6、t(生成者%d:,finalI);).start();for(inti=1;istorage.consume(String.format(消費(fèi)者%d:,finalI).start();iew結(jié)果如下:倉(cāng)庫(kù)已空,【消費(fèi)者1:暫時(shí)不能執(zhí)行消費(fèi)任務(wù)【生產(chǎn)者3:生產(chǎn)了一個(gè)產(chǎn)品【現(xiàn)倉(cāng)儲(chǔ)量為】【消費(fèi)者2】:消費(fèi)了一個(gè)產(chǎn)品【現(xiàn)倉(cāng)儲(chǔ)量為】倉(cāng)庫(kù)已空,【消費(fèi)者3】:暫時(shí)不能執(zhí)行消費(fèi)任務(wù)現(xiàn)倉(cāng)儲(chǔ)量為】:1現(xiàn)倉(cāng)儲(chǔ)量為】:2現(xiàn)倉(cāng)儲(chǔ)量為】:3現(xiàn)倉(cāng)儲(chǔ)量為】:4現(xiàn)倉(cāng)儲(chǔ)量為】:3現(xiàn)倉(cāng)儲(chǔ)量為】:2生產(chǎn)者1】:生產(chǎn)了一個(gè)產(chǎn)品生產(chǎn)者4】:生產(chǎn)了一個(gè)產(chǎn)品生產(chǎn)者2】:生產(chǎn)了一個(gè)產(chǎn)品生產(chǎn)者5】:生產(chǎn)了一個(gè)產(chǎn)品消費(fèi)者1】:消費(fèi)了一個(gè)產(chǎn)品消費(fèi)者

7、3】:消費(fèi)了一個(gè)產(chǎn)品2.2await()/signal()方法await(和signal(的功能基本上和wait()/n相囤完全可以取代它們,但是它們和新引入的鎖定機(jī)制直接掛鉤,具有更大的靈活性。通過(guò)在對(duì)象上調(diào)用nwniti方法)將條件變量和一個(gè)鎖對(duì)象進(jìn)行綁定,進(jìn)而控制并發(fā)程序訪問(wèn)競(jìng)爭(zhēng)資源的安全。緩沖區(qū)tag代碼女如下:atva.】til.LinkedList;atva.】til.on:】rrent.lo:ks.Condition;atva.】til.:on:】rrent.lo:k.Lo:k;atva.】til.:on:】rrent.lo:ks.Reentrantlilassstag/倉(cāng)庫(kù)最大

8、存儲(chǔ)量privafteinainltMA/倉(cāng)庫(kù)存儲(chǔ)的載體ListprivaLteinkedListinlikste=d/鎖privafteinaLlo:klon:ekwR=eentrantLo:k()t().newCondition()/倉(cāng)庫(kù)滿的條件變量privafteinaClonditionfull=.newCondition()/倉(cāng)庫(kù)空的條件變量privafteinaClonditionempt/生產(chǎn)產(chǎn)品pubvlicoipdroduce(Stringplock.lock();/如果倉(cāng)庫(kù)已滿while(list.size()=MAX_Sst.t.倉(cāng)庫(kù)已滿,【t/由于條件不滿足,生產(chǎn)阻塞f

9、ull.await();catc(hInterruptedExe.printStackTrace()ucer)】:暫時(shí)不能執(zhí)行生產(chǎn)任務(wù))tione)/生產(chǎn)產(chǎn)品list.addn(ewObje:t();System.o】t.p【r,intl+n(empty.signalAll();/釋放鎖lo:k.】nlo:k();】:生產(chǎn)了一個(gè)產(chǎn)品【現(xiàn)倉(cāng)儲(chǔ)量為】list.si()/消費(fèi)產(chǎn)品p】bvli:oi:dons】me(String:ons】mer)/獲得鎖lo:k.lo:k();/如果倉(cāng)庫(kù)存儲(chǔ)量不足while(list.size()=0)st.t.倉(cāng)庫(kù)已空,【t/由于條件不滿足,消費(fèi)阻塞t.await(

10、)at(nttinttaa()ns】:暫時(shí)不能執(zhí)行消費(fèi)任務(wù))tin)st.remove();eou【inConue】:消費(fèi)了一個(gè)產(chǎn)品【現(xiàn)倉(cāng)儲(chǔ)量為】liieull.signalAll();釋放鎖lock.unlockulicinkeiecgeeUinulivoieiinkeieclililiulingeeunieoe2.3BlockingQueue方法gn它可以在生成對(duì)象時(shí)指定容量大小。它用于阻它是一個(gè)已經(jīng)在內(nèi)部實(shí)現(xiàn)了同步的隊(duì)列,實(shí)現(xiàn)方式采用的是我們第2種i塞操作的是u和k方法:u方法:類似于我們上面的生產(chǎn)者線程,容量達(dá)到最大時(shí),自動(dòng)阻塞。k方法:類似于我們上面的消費(fèi)者線程,容量為時(shí),自動(dòng)阻塞。

11、po【j【ava.u【il.concu【en【.LinkedBlockingQueue;uldoge倉(cāng)庫(kù)最大存儲(chǔ)量iinedl倉(cāng)庫(kù)存儲(chǔ)的載體iinkeBlockingQueueecneliinkeBlockingQueueec生產(chǎn)產(chǎn)品ulivoiouceingouce如果倉(cāng)庫(kù)已滿ili.iee.ou.倉(cāng)庫(kù)i已滿noude:暫時(shí)不能執(zhí)行生產(chǎn)任務(wù)生產(chǎn)產(chǎn)品li.newecca【c(hIn【e:up【edExceioneu【o-gene【a【edca【chblocke.p:inackT:ace(:;Sys【em.ou【p:in+lnoude:生+產(chǎn)了一個(gè)產(chǎn)品【現(xiàn)倉(cāng)儲(chǔ)量為】:+lis.size消/費(fèi)產(chǎn)品ublivcoidconsume(S【ingconume【:如果倉(cāng)庫(kù)存儲(chǔ)量不足if(lis【.size(em.ou.倉(cāng)庫(kù)i已空nconsume】【:+暫時(shí)不能執(zhí)行消費(fèi)任務(wù)!:lis【.【ake(ca【c(hIn【e:up【edExceione:u【o-genera【edca【chblocke.p:inackT:ace(:;Sys

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論