java實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題_第1頁(yè)
java實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題_第2頁(yè)
java實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題_第3頁(yè)
java實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題_第4頁(yè)
java實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩11頁(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、實(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論