![java實(shí)現(xiàn)讀者寫者問題_第1頁](http://file4.renrendoc.com/view/f5deeceb46007667cec282fe1a5780d3/f5deeceb46007667cec282fe1a5780d31.gif)
![java實(shí)現(xiàn)讀者寫者問題_第2頁](http://file4.renrendoc.com/view/f5deeceb46007667cec282fe1a5780d3/f5deeceb46007667cec282fe1a5780d32.gif)
![java實(shí)現(xiàn)讀者寫者問題_第3頁](http://file4.renrendoc.com/view/f5deeceb46007667cec282fe1a5780d3/f5deeceb46007667cec282fe1a5780d33.gif)
![java實(shí)現(xiàn)讀者寫者問題_第4頁](http://file4.renrendoc.com/view/f5deeceb46007667cec282fe1a5780d3/f5deeceb46007667cec282fe1a5780d34.gif)
![java實(shí)現(xiàn)讀者寫者問題_第5頁](http://file4.renrendoc.com/view/f5deeceb46007667cec282fe1a5780d3/f5deeceb46007667cec282fe1a5780d35.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)名稱:用信號(hào)量來實(shí)現(xiàn)讀者-寫者問題實(shí)驗(yàn)?zāi)康模豪斫膺M(jìn)程同步與互斥的概念,掌握用信號(hào)量來實(shí)現(xiàn)進(jìn)程的 同步與互斥。實(shí)驗(yàn)設(shè)計(jì)及實(shí)現(xiàn):為了實(shí)現(xiàn)讀者和寫者的讀寫過程,將每個(gè)讀者和每個(gè)寫者作 為了一個(gè)單獨(dú)的線程,所以設(shè)置了兩個(gè)類,一個(gè)是讀者類Reader, 一個(gè)是寫者類Writer.以讀者類為例:一個(gè)讀者的動(dòng)作過程為由睡眠-等待-開始讀-結(jié)束讀- 睡眠的一個(gè)循環(huán)過程,而一個(gè)寫者的動(dòng)作過程也為此.讀者調(diào)用方法napping()進(jìn)行等待,調(diào)用startRead()方法開 始讀,最后在調(diào)用endReading()方法結(jié)束讀入,釋放運(yùn)行空間.寫 者同讀
2、者.但是為了實(shí)現(xiàn)讀者寫者之間的寫-寫互斥,讀-寫互斥,讀-讀允 許,需要另外一個(gè)類Database,類中分別用關(guān)于讀者的方法和寫者 的方法來控制讀寫之間的這種關(guān)系.首先要實(shí)現(xiàn)睡眠的方法napping(),讀者和寫者在睡眠過程 都應(yīng)該是一樣的,只是他們睡眠的時(shí)間不同,所以只需寫出一個(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è)方法,開始讀和結(jié)束讀,由于這只是 個(gè)模擬讀寫問題,所以只需要知道結(jié)果就行,就不用顯示出他是怎 么讀的.在開始讀中,當(dāng)有寫者在寫時(shí),讀者需要等待wait(),在沒有 人在工作時(shí),如果有寫者和讀者同時(shí)請(qǐng)求,那么就讓寫者先進(jìn),這 是寫者優(yōu)先.所以這就歸納于一種情況,當(dāng)讀者布爾變量 dbReading為FALSE時(shí),如果有需要工作的寫者,那么讀者就等待. 當(dāng)讀者請(qǐng)求讀入后,計(jì)數(shù)有多少讀者需要工作的變量readerCount
4、 +1,如果這是第一個(gè)進(jìn)入工作的讀者就需要將顯示是否有讀者在 工作的讀者布爾變量變?yōu)門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;第三,編寫關(guān)于寫者的開始寫和結(jié)束寫方法,在開始寫方法中, 首先要將計(jì)數(shù)需要寫的變量writerCount+1,寫者如果有讀者或者 有寫者正在工作,那么就等待,如果沒有就直接進(jìn)入寫,然后表示是
6、否有寫者在寫的布爾變量dbWriting變?yōu)門RUEpublic synchronized void startWriting() /控制寫者開 始進(jìn)入寫+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() /控制寫者結(jié)束 寫入-writerCount;dbWriting = false;System.out.println(one writer is done, writing.Count= + writerCount);notifyAll();源代碼及程序流程圖主類:package rw;/* author xzy*/public static void main(String args) (Database db=new Database();/實(shí)例化類 Database 為 dbReader r1=new Reade
8、r(1,db);/實(shí)例化類 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í)例化類 Writer 為 w1Writer w2=new Writer(2,db);r1.start();/讀者1調(diào)用start()方法開始進(jìn)入讀寫這個(gè)模擬環(huán)境 中r2.start();r3.start();w1.start();r4.start();w2.start();Database 類: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ù)需要寫的寫者private boolean dbReading;/表 示是否有讀者在讀private boolean dbWriting;/表 示是否有寫者在寫public Database() (readerCount = 0;/變量計(jì)數(shù)需要讀的讀者為0writerCount = 0;/變量計(jì)數(shù)需要寫的寫者為0dbReading
10、 = false;/表示沒有讀者正在讀入dbWriting = false;/表示沒有寫者正在寫入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() /控制讀者開始讀if (dbReading = false) /當(dāng) 沒有讀者在讀時(shí)whi
11、le (writerCount 0) / 當(dāng)有寫者想寫時(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() /控制寫者開始進(jìn)入寫+writerCount;/想寫的寫者數(shù)加一while (dbReading = true | dbWriting = true) / 當(dāng)有讀者在 讀或者有寫者在寫時(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() /控制寫者結(jié)束寫入 -writerCount;dbWriting = false;System.out.println(one writer is done, writing. Count= + writerCount);notifyAll();Reader 類:package rw;/* au
14、thor xzy*/public class Reader extends Thread (private Database server;/設(shè)置一個(gè)Database變量用來控制該讀者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();/讀者開始請(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 類:package rw;/* author xzy*/public class Writer extends Thread (private Database server;/設(shè)置一個(gè)Database變量用來控制該寫者 private int writerNum;/設(shè)置該寫者的標(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();/表明寫者正在睡眠狀態(tài)System.out.println(Writer + writerNum + wants to write);server.startWriting();/寫者開始請(qǐng)求讀入工作System.out.println(Writer + writerNum + is writing);Database.napping();/寫者處于工作階段 server.endWriting();/寫者結(jié)束工作System.out.println(It is Writer + writerNum + who has done writing .);讀者:否實(shí)驗(yàn)當(dāng)堂所要完成的事情:解決編譯和運(yùn)行出現(xiàn)的問題.編譯過程中出現(xiàn)的問題及其相應(yīng)解決:1.一個(gè)讀者或者寫者工作完時(shí)無法釋放出空間給其他人解決:用了 notifyall()方法,最開始只知道notify()方法,要釋放出空間給 所有人平等使用權(quán)利那么就必須用notifyall()方法.運(yùn)行過程中出現(xiàn)的問題及其相應(yīng)解決:1.實(shí)現(xiàn)了寫者優(yōu)先但是沒有實(shí)現(xiàn)讀讀允許解決:加了一個(gè)判斷if,如果沒有讀者讀才
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 深入探討科技企業(yè)如何通過強(qiáng)化知識(shí)產(chǎn)權(quán)保護(hù)來提升品牌形象和競(jìng)爭(zhēng)力
- 現(xiàn)代綠色辦公樓的設(shè)計(jì)與施工經(jīng)驗(yàn)分享
- 生產(chǎn)制造中基于智能算法的調(diào)度系統(tǒng)設(shè)計(jì)
- 2023三年級(jí)英語上冊(cè) Unit 3 My friends第4課時(shí)說課稿 牛津譯林版
- 2024年春八年級(jí)語文下冊(cè) 第二單元 5 大自然的語言說課稿 新人教版
- 9 烏鴉喝水(說課稿)-2024-2025學(xué)年統(tǒng)編版語文一年級(jí)上冊(cè)
- Unit 4 My Family Lesson 2(說課稿)-2023-2024學(xué)年人教新起點(diǎn)版英語三年級(jí)下冊(cè)
- Unit 6 Useful numbers Lesson 2(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級(jí)上冊(cè)
- 2024-2025學(xué)年高中歷史 第三單元 各國經(jīng)濟(jì)體制的創(chuàng)新和調(diào)整 第16課 戰(zhàn)后資本主義經(jīng)濟(jì)的調(diào)整教學(xué)說課稿 岳麓版必修2
- 2025淮安市城東花園小區(qū)門禁系統(tǒng)工程合同
- 精神分裂癥合并糖尿病患者護(hù)理查房課件
- 銷售調(diào)味品工作總結(jié)5篇
- 2024年江蘇省勞動(dòng)合同條例
- 成人鼻腸管的留置與維護(hù)
- 《中電聯(lián)團(tuán)體標(biāo)準(zhǔn)-220kV變電站并聯(lián)直流電源系統(tǒng)技術(shù)規(guī)范》
- 中國主要蜜源植物蜜源花期和分布知識(shí)
- 電化學(xué)免疫傳感器的應(yīng)用
- 數(shù)據(jù)中心基礎(chǔ)知識(shí)培訓(xùn)-2024鮮版
- 供電企業(yè)輿情的預(yù)防及處置
- 【高中語文】《氓》課件++統(tǒng)編版+高中語文選擇性必修下冊(cè)
- T-WAPIA 052.3-2023 無線局域網(wǎng)設(shè)備技術(shù)規(guī)范 第3部分:接入點(diǎn)和控制器
評(píng)論
0/150
提交評(píng)論