版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)一實(shí)驗(yàn)報(bào)告學(xué)號(hào):20092128姓名:徐卓遠(yuǎn)實(shí)驗(yàn)序號(hào):1實(shí)驗(yàn)名稱(chēng):用信號(hào)量來(lái)實(shí)現(xiàn)讀者-寫(xiě)者問(wèn)題實(shí)驗(yàn)?zāi)康模豪斫膺M(jìn)程同步與互斥的概念,掌握用信號(hào)量來(lái)實(shí)現(xiàn)進(jìn)程的 同步與互斥。實(shí)驗(yàn)設(shè)計(jì)及實(shí)現(xiàn):為了實(shí)現(xiàn)讀者和寫(xiě)者的讀寫(xiě)過(guò)程,將每個(gè)讀者和每個(gè)寫(xiě)者作 為了一個(gè)單獨(dú)的線程,所以設(shè)置了兩個(gè)類(lèi),一個(gè)是讀者類(lèi)Reader, 一個(gè)是寫(xiě)者類(lèi)Writer.以讀者類(lèi)為例:一個(gè)讀者的動(dòng)作過(guò)程為由睡眠-等待-開(kāi)始讀-結(jié)束讀- 睡眠的一個(gè)循環(huán)過(guò)程,而一個(gè)寫(xiě)者的動(dòng)作過(guò)程也為此.讀者調(diào)用方法napping()進(jìn)行等待,調(diào)用startRead()方法開(kāi) 始讀,最后在調(diào)用endReading()方法結(jié)束讀入,釋放運(yùn)行空間.寫(xiě) 者同讀
2、者.但是為了實(shí)現(xiàn)讀者寫(xiě)者之間的寫(xiě)-寫(xiě)互斥,讀-寫(xiě)互斥,讀-讀允 許,需要另外一個(gè)類(lèi)Database,類(lèi)中分別用關(guān)于讀者的方法和寫(xiě)者 的方法來(lái)控制讀寫(xiě)之間的這種關(guān)系.首先要實(shí)現(xiàn)睡眠的方法napping(),讀者和寫(xiě)者在睡眠過(guò)程 都應(yīng)該是一樣的,只是他們睡眠的時(shí)間不同,所以只需寫(xiě)出一個(gè)方 法:public static void napping() int sleepTime = (int) (NAP_TIME * Math.random();try Thread.sleep(sleepTime * 1000); catch (Exception e) e.printStackTrace();在方
3、法中,控制線程休眠隨機(jī)的時(shí)間,由于每個(gè)讀者或?qū)懻?都是一個(gè)線程,而每個(gè)讀者或?qū)懻咚麄児ぷ餍菝叩臅r(shí)間都不一定 相同,他們請(qǐng)求工作的時(shí)間也不一定相同,所以取了隨機(jī)時(shí)間其次設(shè)置了讀者的兩個(gè)方法,開(kāi)始讀和結(jié)束讀,由于這只是 個(gè)模擬讀寫(xiě)問(wèn)題,所以只需要知道結(jié)果就行,就不用顯示出他是怎 么讀的.在開(kāi)始讀中,當(dāng)有寫(xiě)者在寫(xiě)時(shí),讀者需要等待wait(),在沒(méi)有 人在工作時(shí),如果有寫(xiě)者和讀者同時(shí)請(qǐng)求,那么就讓寫(xiě)者先進(jìn),這 是寫(xiě)者優(yōu)先.所以這就歸納于一種情況,當(dāng)讀者布爾變量 dbReading為FALSE時(shí),如果有需要工作的寫(xiě)者,那么讀者就等待. 當(dāng)讀者請(qǐng)求讀入后,計(jì)數(shù)有多少讀者需要工作的變量readerCount
4、 +1,如果這是第一個(gè)進(jìn)入工作的讀者就需要將顯示是否有讀者在 工作的讀者布爾變量變?yōu)門(mén)RUE.public synchronized int startRead() while (writerCount 0) try System.out.println(reader is waiting);wait(); catch (Exception e) System.out.println(e.toString();e.printStackTrace();+readerCount;if (readerCount = 1) dbReading = true;return readerCount;讀結(jié)束
5、時(shí),計(jì)數(shù)需要讀的讀者數(shù)-1,然后釋放出空間給需要 工作的人.public synchronized int endReading() -readerCount;dbReading = false;notifyAll();/釋放出空間System.out.println(one reader is done, reading.Count= + readerCount);return readerCount;第三,編寫(xiě)關(guān)于寫(xiě)者的開(kāi)始寫(xiě)和結(jié)束寫(xiě)方法,在開(kāi)始寫(xiě)方法中, 首先要將計(jì)數(shù)需要寫(xiě)的變量writerCount+1,寫(xiě)者如果有讀者或者 有寫(xiě)者正在工作,那么就等待,如果沒(méi)有就直接進(jìn)入寫(xiě),然后表示是
6、否有寫(xiě)者在寫(xiě)的布爾變量dbWriting變?yōu)門(mén)RUEpublic synchronized void startWriting() /控制寫(xiě)者開(kāi) 始進(jìn)入寫(xiě)+writerCount;while (dbReading = true | dbWriting = true) try System.out.println(Writer is waiting); wait(); catch (Exception e) System.out.println(e.toString();dbWriting = true;結(jié)束時(shí)只需將writerCount-1和dbWriting為FALSE,然后釋 放出空間.p
7、ublic synchronized void endWriting() /控制寫(xiě)者結(jié)束 寫(xiě)入-writerCount;dbWriting = false;System.out.println(one writer is done, writing.Count= + writerCount);notifyAll();源代碼及程序流程圖主類(lèi):package rw;/* author xzy*/public static void main(String args) (Database db=new Database();/實(shí)例化類(lèi) Database 為 dbReader r1=new Reade
8、r(1,db);/實(shí)例化類(lèi) Reader 為 r1Reader r2=new Reader(2,db);Reader r3=new Reader(3,db);Reader r4=new Reader(4,db);Writer w1=new Writer(1,db);/實(shí)例化類(lèi) Writer 為 w1Writer w2=new Writer(2,db);r1.start();/讀者1調(diào)用start()方法開(kāi)始進(jìn)入讀寫(xiě)這個(gè)模擬環(huán)境 中r2.start();r3.start();w1.start();r4.start();w2.start();Database 類(lèi):package rw;/* aut
9、hor xzy*/public class Database (private static final int NAP_TIME = 5;private int readerCount;/變量計(jì)數(shù)需要讀的讀者private int writerCount;/變量計(jì)數(shù)需要寫(xiě)的寫(xiě)者private boolean dbReading;/表 示是否有讀者在讀private boolean dbWriting;/表 示是否有寫(xiě)者在寫(xiě)public Database() (readerCount = 0;/變量計(jì)數(shù)需要讀的讀者為0writerCount = 0;/變量計(jì)數(shù)需要寫(xiě)的寫(xiě)者為0dbReading
10、 = false;/表示沒(méi)有讀者正在讀入dbWriting = false;/表示沒(méi)有寫(xiě)者正在寫(xiě)入public static void napping() /控制睡眠的時(shí)間int sleepTime = (int) (NAP_TIME * Math.random();/ 睡眠時(shí)間隨機(jī)try (Thread.sleep(sleepTime * 1000); catch (Exception e) (e.printStackTrace();public synchronized int startRead() /控制讀者開(kāi)始讀if (dbReading = false) /當(dāng) 沒(méi)有讀者在讀時(shí)whi
11、le (writerCount 0) / 當(dāng)有寫(xiě)者想寫(xiě)時(shí)try System.out.println(reader is waiting);wait();/ 等待 catch (Exception e) System.out.println(e.toString();e.printStackTrace();+readerCount;/請(qǐng)求讀入的讀者數(shù)加一if (readerCount = 1) dbReading = true;/標(biāo)明有讀者正在讀 return readerCount;public synchronized int endReading() /控制讀者結(jié)束讀入 -readerC
12、ount;if (readerCount = 0) dbReading = false;notifyAll();/釋放出空間給其他的線程System.out.println(one reader is done, reading. Count= + readerCount);return readerCount;public synchronized void startWriting() /控制寫(xiě)者開(kāi)始進(jìn)入寫(xiě)+writerCount;/想寫(xiě)的寫(xiě)者數(shù)加一while (dbReading = true | dbWriting = true) / 當(dāng)有讀者在 讀或者有寫(xiě)者在寫(xiě)時(shí)都得等待try Sy
13、stem.out.println(Writer is waiting);wait(); catch (Exception e) (System.out.println(e.toString();dbWriting = true;public synchronized void endWriting() /控制寫(xiě)者結(jié)束寫(xiě)入 -writerCount;dbWriting = false;System.out.println(one writer is done, writing. Count= + writerCount);notifyAll();Reader 類(lèi):package rw;/* au
14、thor xzy*/public class Reader extends Thread (private Database server;/設(shè)置一個(gè)Database變量用來(lái)控制該讀者private int readerNum;/設(shè)置該讀者的標(biāo)志public Reader(int r, Database db) (readerNum = r;server = db;Overridepublic void run() (int c;while (true) (System.out.println(reader + readerNum + is sleeping);Database.napping
15、();/表明讀者正在睡眠狀態(tài)System.out.println(reader + readerNum + wants to read);c = server.startRead();/讀者開(kāi)始請(qǐng)求讀入工作System.out.println(reader + readerNum + is reading.Count= + c);Database.napping();/讀者處于工作階段c = server.endReading();/讀者結(jié)束工作System.out.println(It is reader + readerNum + who has done reading accordin
16、g to count= + c);Writer 類(lèi):package rw;/* author xzy*/public class Writer extends Thread (private Database server;/設(shè)置一個(gè)Database變量用來(lái)控制該寫(xiě)者 private int writerNum;/設(shè)置該寫(xiě)者的標(biāo)志public Writer(int w, Database db) ( writerNum = w;server = db;Overridepublic void run() (while (true) (System.out.println(Writer + wri
17、terNum + is sleeping);Database.napping();/表明寫(xiě)者正在睡眠狀態(tài)System.out.println(Writer + writerNum + wants to write);server.startWriting();/寫(xiě)者開(kāi)始請(qǐng)求讀入工作System.out.println(Writer + writerNum + is writing);Database.napping();/寫(xiě)者處于工作階段 server.endWriting();/寫(xiě)者結(jié)束工作System.out.println(It is Writer + writerNum + who has done writing .);讀者:否實(shí)驗(yàn)當(dāng)堂所要完成的事情:解決編譯和運(yùn)行出現(xiàn)的問(wèn)題.編譯過(guò)程中出現(xiàn)的問(wèn)題及其相應(yīng)解決:1.一個(gè)讀者或者寫(xiě)者工作完時(shí)無(wú)法釋放出空間給其他人解決:用了 notifyall()方法,最開(kāi)始只知道notify()方法,要釋放出空間給 所有人平等使用權(quán)利那么就必須用notifyall()方法.運(yùn)行過(guò)程中出現(xiàn)的問(wèn)題及其相應(yīng)解決:1.實(shí)現(xiàn)了寫(xiě)者優(yōu)先但是沒(méi)有實(shí)現(xiàn)讀讀允許解決:加了一個(gè)判斷if,如果沒(méi)有讀者讀才
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)經(jīng)濟(jì)型酒店行業(yè)全國(guó)市場(chǎng)開(kāi)拓戰(zhàn)略制定與實(shí)施研究報(bào)告
- 新形勢(shì)下人力資源服務(wù)行業(yè)轉(zhuǎn)型升級(jí)戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)中醫(yī)藥服務(wù)貿(mào)易行業(yè)并購(gòu)重組擴(kuò)張戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)老年護(hù)理服務(wù)行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)家庭服務(wù)機(jī)器人行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實(shí)施研究報(bào)告
- 市政道路工程竣工監(jiān)理質(zhì)量評(píng)估報(bào)告
- 旅行套裝問(wèn)卷調(diào)查
- 2025年中國(guó)口罩行業(yè)市場(chǎng)調(diào)查研究及投資前景預(yù)測(cè)報(bào)告
- 白皮紙行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 母嬰零食知識(shí)培訓(xùn)課件
- 微型消防站消防員培訓(xùn)內(nèi)容
- 大一中國(guó)近代史綱要期末考試試題及答案
- (完整版)鋼筋加工棚驗(yàn)算
- 安徽省合肥市廬陽(yáng)區(qū)2023-2024學(xué)年三年級(jí)上學(xué)期期末數(shù)學(xué)試卷
- 概念方案模板
- 西南交大畢業(yè)設(shè)計(jì)-地鐵車(chē)站主體結(jié)構(gòu)設(shè)計(jì)
- 2024年山東傳媒職業(yè)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 江蘇省南通市崇川區(qū)2023-2024學(xué)年三年級(jí)上學(xué)期期末語(yǔ)文試卷
- crtd植入術(shù)護(hù)理查房
- 掃雪鏟冰安全教育培訓(xùn)
- 人教版三年級(jí)下冊(cè)必讀書(shū)目《中國(guó)古代寓言故事》
評(píng)論
0/150
提交評(píng)論