


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)生產(chǎn)者-消費(fèi)者問(wèn)題(PV操作)Java實(shí)現(xiàn))、問(wèn)題描述組生產(chǎn)者進(jìn)程和一組消費(fèi)者進(jìn)程共享一個(gè)初始為空、大小n的緩沖區(qū),只有緩沖區(qū)沒(méi)滿(mǎn)時(shí),生產(chǎn)者才能把資源放入緩沖區(qū),否則必須等待;只有緩沖區(qū)不為空時(shí),消費(fèi)者才能從中取出資源,否則必須等待。由于緩沖區(qū)是臨界資源,它只允許一個(gè)生產(chǎn)者放入資源,或一個(gè)消費(fèi)者從中取出資源。二、問(wèn)題分析、關(guān)系分析。生產(chǎn)者和消費(fèi)者對(duì)緩沖區(qū)互斥訪問(wèn)是互斥關(guān)系,同時(shí)生產(chǎn)者和消費(fèi)者又是一個(gè)相互協(xié)作的關(guān)系,只有生產(chǎn)者生產(chǎn)之后,消費(fèi)者只能才能消費(fèi),它們還是同步關(guān)系。、整理思路。只有生產(chǎn)生產(chǎn)者和消費(fèi)者進(jìn)程,正好是這兩個(gè)進(jìn)程存在著互斥關(guān)系和同步關(guān)系,即需要解決的是互斥和同步PV操作的
2、位置。、信號(hào)量設(shè)置。信號(hào)量mutex作為互斥信號(hào)量,用于控制互斥訪問(wèn)緩沖池,互斥信號(hào)量初值為1;信號(hào)量full用于記錄當(dāng)前緩沖池中的“滿(mǎn)”緩沖池,初值為0;信號(hào)量empty用于記錄當(dāng)前緩沖池中“空“緩沖區(qū)數(shù),初值為n。三、代碼實(shí)現(xiàn)mportjava.util.Scanner;publicclassProConpublicstaticvoidmain(Stringargs)intproducer,consumer;Scannersc=newScanner(System.in);System.out.print(”請(qǐng)輸入生產(chǎn)者數(shù)目:);produce=sc.nextInt();輸入生產(chǎn)者數(shù)量Sys
3、tem.out.print(請(qǐng)輸入消費(fèi)者數(shù)目:);consumer=sc.nextInt();輸入消費(fèi)者數(shù)量for(inti=0;iproducer;i+)newThread(newProducer(),生產(chǎn)者+Integer.toString(i)+號(hào)).start();創(chuàng)建生產(chǎn)者線程并開(kāi)啟for(intj=0;jconsumer;j+)newThread(newConsumer。,消費(fèi)者+Integer.toString(j)+號(hào)).start();創(chuàng)建消費(fèi)者線程并開(kāi)啟classGlobal_publicstaticSemaphoreempty=newSemaphore(3);空閑緩沖區(qū)初
4、始化為三publicstaticSemaphorefull=newSemaphore(0);滿(mǎn)緩沖區(qū)初始化為空publicstaticSemaphoremutex=newSemaphore(1);臨界區(qū)互斥信號(hào)量publicstaticintcount=0;coiffli于緩沖區(qū)中的進(jìn)程進(jìn)行計(jì)數(shù)定時(shí)等待publicstaticvoidtimingwait()tryThread.sleep(2000);Thread.Sleepi(法用于將當(dāng)前線程休眠一定時(shí)間寸間單位是ns,1s=1000mscatch(InterruptedExceptione)當(dāng)使用ava.lang.Thread類(lèi)的sleep
5、方法時(shí),可能會(huì)導(dǎo)致線程阻塞,需要拋出terruptedException(中斷異常)異常e.printStackTrace();生產(chǎn)者classProducerimplementsRunnableRunnaib掃創(chuàng)建新線程O(píng)verridepublicvoidrun()Runnab接口可以被任何想要被一個(gè)線程運(yùn)行的接口繼承實(shí)現(xiàn);繼Runnable接口的類(lèi)必須有一個(gè)run()方法System.out.println(Thread.currentThread().getName()+生產(chǎn)出一個(gè)商品.);Thread.currentThread().getNami得當(dāng)前執(zhí)行的線程GlobaLempty
6、.P();獲取空緩沖區(qū)單元Global.mutex.P();進(jìn)入臨界區(qū)Global.timingwait();System.out.println(Thread.currentThread().getName()+將產(chǎn)品放入緩沖區(qū)-緩沖區(qū)剩余+(+Global.count)+個(gè)產(chǎn)品);Global.mutex.V();離開(kāi)臨界區(qū),釋放信號(hào)量Global.full.V();滿(mǎn)緩沖區(qū)數(shù)加一消費(fèi)者classConsumerimplementsRunnableOverridepublicvoidrun()Global.timingwait();Global.full.P();獲取滿(mǎn)緩沖區(qū)單元Globa
7、l.mutex.P();進(jìn)入臨界區(qū)Global.timingwait();System.out.println(Thread.currentThread().getName()+從緩沖區(qū)取出一個(gè)產(chǎn)品一緩沖區(qū)剩余+(-Global.count)+個(gè)產(chǎn)品”);Global.mutex.V();離開(kāi)臨界區(qū),釋放互斥信號(hào)量Global.empty.V();空緩沖區(qū)加一System.out.println(Thread.currentThread().getName()+消費(fèi)一個(gè)商品.);信號(hào)量classSemaphorepublicintvalue;publicSemaphore(intvalue)s
8、uper();this.value=value;齢publicsynchronizedfinalvoidP()使用synchronized修飾的方法叫做同步方法保證線程執(zhí)行該方法的時(shí)其他線程只能在方法外等著被final修飾的方法是一個(gè)最終方法,不能被重腫寫(xiě)會(huì)報(bào)錯(cuò)value-;if(value0)trythis.wait();當(dāng)緩沖區(qū)已滿(mǎn)空時(shí),生產(chǎn)者或消費(fèi)者線程停止自己的執(zhí)行,釋放鎖,使自己處于等待狀態(tài),讓其它線程執(zhí)行catch(InterruptedExceptione)當(dāng)使用ava.lang.Threadd的wait方法時(shí),可能會(huì)導(dǎo)致線程阻塞,需要拋出terruptedException(中
9、斷異常)異常e.printStackTrace();操作publicsynchronizedfinalvoidV()value+;if(value=0)this.notify();當(dāng)生產(chǎn)者或消費(fèi)者向緩沖區(qū)放入或取出一個(gè)產(chǎn)品時(shí),向其他等待的線程發(fā)出通知,同時(shí)釋放鎖,使自己處于等待狀態(tài),讓其它線程執(zhí)行。I四、運(yùn)行效果情筠人Z產(chǎn)者數(shù)目:請(qǐng)鑰人泊身者數(shù)目:匸產(chǎn)老J號(hào)生產(chǎn)匚!一個(gè)商詁蘭產(chǎn)老2號(hào)生產(chǎn)亡一個(gè)商晶蘭產(chǎn)老1號(hào)生產(chǎn)匚!一商晶蘭產(chǎn)老J號(hào)埒產(chǎn)頤人緩;口區(qū)-緩沖図剩宗1八產(chǎn)品蘭產(chǎn)老2號(hào)埒產(chǎn)品取人緩;口區(qū)-緩沖図剩毛“產(chǎn)品蘭產(chǎn)老1號(hào)埒產(chǎn)頤人緩;口恆-緩沖図剩余產(chǎn)品消身老1號(hào)趴緩井區(qū)取匚!一牛產(chǎn)詰緩沖區(qū)剩余
10、2牛產(chǎn)詰消身老1號(hào)涓費(fèi)一傘商品(運(yùn)行結(jié)果是以緩沖區(qū)夬小為3,疇數(shù)量為2和缶產(chǎn)者數(shù)量為3為初始值)五、知識(shí)總結(jié)1、該類(lèi)問(wèn)題需要注意對(duì)緩沖區(qū)大小為n的處理,當(dāng)緩沖區(qū)中有空時(shí),便可對(duì)empty變量執(zhí)行P操作,一旦取走一個(gè)資源便可執(zhí)行V操作以釋放空閑區(qū)。對(duì)empty和full變量的P操作必須放在mutex的P操作之前。2、P操作即wait操作表示進(jìn)程請(qǐng)求一個(gè)資源,V操作即signal表示進(jìn)程釋放一個(gè)資源,且信號(hào)量機(jī)制遵循了同步機(jī)制的“讓權(quán)等待”原則。3、wait():當(dāng)緩沖區(qū)已滿(mǎn)/空時(shí),生產(chǎn)者或消費(fèi)者線程停止自己的執(zhí)行,釋放鎖,使自己處于等待狀態(tài),讓其它線程執(zhí)行。notify():當(dāng)生產(chǎn)者或消費(fèi)者向緩沖區(qū)放入或取出一個(gè)產(chǎn)品時(shí),向其他等待的線程發(fā)出通知,同時(shí)釋放鎖,使
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年鋁合金精密模鍛件項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 研學(xué)設(shè)計(jì)指導(dǎo):從8個(gè)維度詳細(xì)探討研學(xué)手冊(cè)設(shè)計(jì)的要點(diǎn)與策略
- 抖音短視頻內(nèi)容創(chuàng)作者保密期限及平臺(tái)分成收益協(xié)議
- 電子政務(wù)數(shù)據(jù)保密及安全管理協(xié)議
- 2025年中國(guó)報(bào)紙期刊行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 新能源汽車(chē)電機(jī)控制系統(tǒng)研發(fā)與市場(chǎng)推廣策劃合同
- 網(wǎng)絡(luò)輿情監(jiān)測(cè)平臺(tái)租賃與信息反饋及安全保障協(xié)議
- 影視音樂(lè)作品版權(quán)獨(dú)家運(yùn)營(yíng)收益分成補(bǔ)充條款
- 牧場(chǎng)奶牛養(yǎng)殖委托管理與品牌推廣合同
- 高端職業(yè)技能培訓(xùn)基地合作辦學(xué)合同
- 2024年國(guó)家開(kāi)放大學(xué)《思想道德與法治》形考大作業(yè)參考答案
- (高清版)JTG D50-2017 公路瀝青路面設(shè)計(jì)規(guī)范
- 草籽播撒勞務(wù)合同
- GB/T 43657.1-2024工業(yè)車(chē)輛能效試驗(yàn)方法第1部分:總則
- 物業(yè)秩序部工作計(jì)劃與整改措施
- 化糞池應(yīng)急預(yù)案
- 2023年-2024年職業(yè)衛(wèi)生檢測(cè)考試題庫(kù)及答案
- 2024年全國(guó)行業(yè)職業(yè)技能競(jìng)賽(電力交易員)備考試題庫(kù)大全(濃縮800題)
- 急性ST段抬高型心肌梗死溶栓治療的合理用藥指南
- 《新聞學(xué)概論》試題及參考答案
- 個(gè)體診所藥房管理制度制度
評(píng)論
0/150
提交評(píng)論