完全理解Java中生產(chǎn)者和消費者模型_第1頁
完全理解Java中生產(chǎn)者和消費者模型_第2頁
完全理解Java中生產(chǎn)者和消費者模型_第3頁
完全理解Java中生產(chǎn)者和消費者模型_第4頁
完全理解Java中生產(chǎn)者和消費者模型_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、生產(chǎn)者與消費者模型在平時的編程中,經(jīng)常遇到一個線程要產(chǎn)生數(shù)據(jù),而另一個線程要處理產(chǎn)生出來的數(shù)據(jù),這其實就是生產(chǎn)者和消費者的關(guān)系。生產(chǎn)者在產(chǎn)生數(shù)據(jù)后可以直接調(diào)用消費者處理數(shù)據(jù);也可以把數(shù)據(jù)放在一個緩沖區(qū)中,讓消費者從緩沖區(qū)中取出數(shù)據(jù)處理,兩種方式從調(diào)用方式上來說,第一種可是說是同步的,即生產(chǎn)者在生產(chǎn)出數(shù)據(jù)后要等待消費者消耗掉后才能生產(chǎn)下一個數(shù)據(jù),等待時間的長短取決于消費者處理數(shù)據(jù)的能力;第二種方式是異步的,生產(chǎn)者只管生產(chǎn)數(shù)據(jù),然后扔到一個緩沖區(qū)內(nèi),不管數(shù)據(jù)是否被立即處理了,消費者則從緩沖區(qū)中依次取出數(shù)據(jù)進行自己節(jié)奏的處理。從線程模型角度來說,第一種是單線程的,而第二種則是多線程的。多線程必須要考

2、慮的一個問題是線程之間的協(xié)作,協(xié)作即協(xié)調(diào)合作,不要亂套,以生產(chǎn)者和消費者模型而言,就是當緩沖區(qū)里沒有數(shù)據(jù)時消費者要等待,等待生產(chǎn)者生產(chǎn)數(shù)據(jù),當緩沖區(qū)滿的時候生產(chǎn)者要等待,等待消費者消耗掉一些數(shù)據(jù)空出位置好存放數(shù)據(jù)。TOC o 1-5 h z中為了實現(xiàn)多線程之間的協(xié)助,需要用到幾個特性:(),(),(),相當于操作系統(tǒng)里的臨界區(qū)或者鎖的概念,所謂臨界區(qū)就是說一次只能有一個線程進去,其他想進入的線程必須等待,加了鎖后,才能調(diào)用(),()和()操作,方法被調(diào)用后,當前線程(舉例)進入被加鎖對象的線程休息室,然后釋放鎖,等待被喚醒。釋放的鎖誰來獲?。慨斎皇怯上惹暗却牧硪粋€線程得到,在獲得鎖后,進行某

3、種操作后通過或者把從線程休息室喚醒,然后釋放鎖,被喚醒后,重新獲取鎖定,進行下一語句的執(zhí)行。再回到生產(chǎn)者和消費者模型,如果引入了緩沖區(qū)的話就需要處理生產(chǎn)者線程和消費者線程之間的協(xié)作,緩沖區(qū)可以有這幾種,隊列緩沖區(qū),比如隊列或者棧,隊列緩沖區(qū)的特點是其長度是動態(tài)增長的,這就意味著內(nèi)存的動態(tài)分配帶來的性能開銷,同時隊列緩沖區(qū)還會產(chǎn)生因為多線程之間的同步和互斥帶來的開銷。環(huán)形緩沖區(qū)可以解決內(nèi)存分配帶來開銷的問題,因為環(huán)形緩沖區(qū)長度是固定的。但是環(huán)形緩沖區(qū)還是無法解決同步互斥帶來的多線程切換的開銷,如果生產(chǎn)者和消費者都不止一個線程,帶來的開銷更大,終極解決辦法是引入雙緩沖區(qū),何為雙緩沖區(qū)?雙緩沖區(qū)顧名

4、思義是有兩個長度固定的緩沖區(qū),生產(chǎn)者和消費者只使用其中一個,當兩個緩沖區(qū)都操作完成后完成一次切換,開始時生產(chǎn)者開始向里寫數(shù)據(jù),消費者從里讀取數(shù)據(jù),當寫滿同時也讀完后,切換一下,這時消費者從里取數(shù)據(jù),生產(chǎn)者向?qū)憯?shù)據(jù),由于生產(chǎn)者和消費者不會同時操作同一個緩沖區(qū),所以不會發(fā)生沖突。生產(chǎn)者和消費者模型不止是用在多線程之間,不同進程之間也可以有。線程和進程到底有什么區(qū)別?這是很多程序員搞不清的問題,其實很簡單,進程有自己的地址空間和上下文,線程是在一個進程上并發(fā)執(zhí)行的代碼段。其實在系統(tǒng)中進程只是占用一定長度的地址空間,進程中總是有一個主線程來運行。消費者和生產(chǎn)者模型應用于進程間通信的典型例子是分布式消息

5、處理,消息的消費者進程需要一個緩沖區(qū)緩沖收到的消息,消息的生產(chǎn)者進程也需要一個緩沖區(qū)緩沖將要發(fā)送的消息,這樣可以一定程度上減少因為網(wǎng)絡(luò)斷開引起的消息丟失。對于此模型,應該明確一下幾點:1,生產(chǎn)者僅僅在倉儲未滿時生產(chǎn),倉滿則停止生產(chǎn)。2,消費者僅僅在倉儲有產(chǎn)品時才能消費,倉空則等待。3,當消費者發(fā)現(xiàn)倉儲沒有產(chǎn)品的時候會通知生產(chǎn)者生產(chǎn)。4,生產(chǎn)者在生產(chǎn)出可消費產(chǎn)品的時候,應該通知等待的消費者去消費。以下是它的具體實現(xiàn):publicclassProducerConsumerpublicstaticvoidmain(Stringargs)SyncStackss=newSyncStack();Produ

6、cerp=newProducer(ss);Consumerc=newConsumer(ss);newThread(p).start();newThread(c).start();8,9,10,classWoTouintid;WoTou(intid)this.id=id;TOC o 1-5 h zpublicStringtoString()returnWoTou:+id;20,classSyncStackintindex=0;WoTouarrWT=newWoTou6;24,publicsynchronizedvoidpush(WoTouwt)while(index=arrWTength)tryt

7、his.wait();catch(InterruptedExceptione)e.printStackTrace();TOC o 1-5 h zthis.notify();arrWTindex=wt;index+;37,publicsynchronizedWoToupop()while(index=0)trythis.wait();42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,c

8、atch(lnterruptedExceptione)e.printStackTrace();this.notify();index-;returnarrWTindex;classProducerimplementsRunnableSyncStackss=null;ProducersyncStackss)this.ss=ss;publicvoidrun()for(inti=0;i20;i+)WoTouwt=newWoTou(i);ss.push(wt);System.out.println(生產(chǎn)了:”+wt);tryThread.sleep(int)(Math.random()*2);catc

9、h(InterruptedExceptione)e.printStackTrace();classConsumerimplementsRunnableSyncStackss=null;Consumer(SyncStackss)this.ss=ss;publicvoidrun()for(inti=0;i20;i+)WoTouwt=ss.pop();System.out.println(消費了:+wt);tryThread.sleep(int)(Math.random()*1000);catch(InterruptedExceptione)e.printStackTrace();TOC o 1-5 h z86,89,附:1程序、進程和線程程序,就是一段靜態(tài)的可執(zhí)行的代碼。進程,就是程序的一次動態(tài)的執(zhí)行過程。線程,是程序從頭到尾的執(zhí)行路線,也稱為輕量級的進程。一個進程在執(zhí)行過程中,可以產(chǎn)生多個線程,形成多個執(zhí)行路線。但線程間是彼此相互獨立的。各個線程可以共享相同的內(nèi)存空間,并利用共享內(nèi)存來完成數(shù)據(jù)交換、實時通信和一些同步的工作。而進程都占有不同的內(nèi)存空間。單線程是指一個程序只有一條從開始到結(jié)束的順序的執(zhí)行路線。多線程是多個彼此獨立的線程,多條執(zhí)行路線。2.wait()、notify()可以在任何位置調(diào)

溫馨提示

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

評論

0/150

提交評論