java實現讀者寫者問題(寫著優(yōu)先)_第1頁
java實現讀者寫者問題(寫著優(yōu)先)_第2頁
java實現讀者寫者問題(寫著優(yōu)先)_第3頁
java實現讀者寫者問題(寫著優(yōu)先)_第4頁
java實現讀者寫者問題(寫著優(yōu)先)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗一實驗報告學號:20092128 姓名:徐卓遠實驗序號:1實驗名稱:用信號量來實現讀者寫者問題實驗目的:理解進程同步與互斥的概念,掌握用信號量來實現進程的 同步與互斥。實驗設計及實現:為了實現讀者和寫者的讀寫過程,將每個讀者和每個寫者作為了一個單獨的線程,所以設置了兩個類,一個是讀者類Reader,一個是寫者類Writer.以讀者類為例:一個讀者的動作過程為由睡眠-等待-> 開始讀-結束讀- 睡眠的一個循環(huán)過程,而一個寫者的動作過程也為此.讀者調用方法napping ()進行等待,調用startRead ()方法開 始讀,最后在調用endReadingO方法結束讀入,釋放運行空間.寫

2、 者同讀者.但是為了實現讀者寫者之間的寫寫互斥,讀寫互斥,讀讀允 許,需要另外一個類Database,類中分別用關于讀者的方法和寫者 的方法來控制讀寫之間的這種關系.首先要實現睡眠的方法nappingO,讀者和寫者在睡眠過程 都應該是一樣的,只是他們睡眠的時間不同,所以只需寫出一個方 法:public static void nappingO int sleepTime = (int) (NAP_TIME * Math, random(); try Thread, sleep(sleepTime * 1000); catch (Exception e) e.printStackTrace();

3、在方法中,控制線程休眠隨機的時間,由于每個讀者或寫者 都是一個線程,而每個讀者或寫者他們工作休眠的時間都不一定 相同,他們請求工作的時間也不一定相同,所以取了隨機時間其次設置了讀者的兩個方法,開始讀和結束讀,由于這只是 個模擬讀寫問題,所以只需要知道結果就行,就不用顯示出他是怎 么讀的.在開始讀中,當有寫者在寫時,讀者需要等待waitO,在沒有 人在工作時,如果有寫者和讀者同時請求,那么就讓寫者先進,這 是寫者優(yōu)先所以這就歸納于一種情況,當讀者布爾變量 dbReading為FALSE時,如果有需要工作的寫者,那么讀者就等待. 當讀者請求讀入后,計數有多少讀者需要工作的變量readerCount

4、 +1,如果這是第一個進入工作的讀者就需要將顯示是否有讀者在 工作的讀者布爾變量變?yōu)門RUE.public synchronized int startRead() if (dbReading 二二 false) while (writerCount 0) try System. out. println (:readeriswaiting");waitO ; catch (Exception e) System. out. println(e. toStringO);e. printStackTrace ();+readerCount;if (readerCount 二二 1) d

5、bReading 二 true;:return readerCount;讀結束時,計數需要讀的讀者數-1,然后釋放出空間給需要 工作的人.public synchronized int endReadingO readerCount;if (readerCount 二二 0) dbReading 二 false;notifyAllO /釋放出空間System. out. println("one reader is done, reading.Count二"+ readerCount);return readerCount;第三,編寫關于寫者的開始寫和結束寫方法,在開始寫方

6、法中, 首先要將計數需要寫的變量writerCount+1,寫者如果有讀者或者 有寫者正在工作,那么就等待,如果沒有就直接進入寫,然后表示是 否有寫者在寫的布爾變量dbWriting變?yōu)門RUEpublic synchronized void startWriting() /控制寫者開 始進入寫+writerCount;while (dbReading = true | dbWriting = true) try System. out. println("Writer is waiting"); wait (); catch (Exception e) System. o

7、ut. println(e. toStringO);dbWriting 二 true;結束時只需將writerCount-1和dbWriting為FALSE,然后釋 放出空間.public synchronized void endWriting() /控制寫者結束 寫入一一writerCount;dbWriting = false;System. out. println("one writer is done, writing.Count二"+ writerCount);notifvAllO :源代碼及程序流程圖 主類:package rw;* author xzv*/

8、public class Main public static void main(String args) Database db=new Database。;/實例化類 Database 為 dbReader rl=new Reader(l,db);/實例化類 Reader 為 rlReader r2=new Reader(2,db);Reader r3=new Reader(3,db);Reader r4=new Reader(4,db);Writer wl=new Writer(l,db);/實例化類 Writer 為 wlWriter w2=new Writer(2,db);rl.s

9、taitO;/讀者1調用stcut()方法開始進入讀寫這個模擬環(huán)境中r2.stai*t();r3.start();wl.stait();r4.stait();w2.stait();Database 類:package rw;* author xzv*/public class Database private static filial int NAP_TIME = 5;private int readerCount;/變量計數需要讀的讀者private int writei-Count;/變量計數需要寫的寫者private boolean dbReadiiig;/表示是否有讀者在讀priva

10、te boolean dbWriting;/表示是否有寫者在寫public Database() readerCount = 0;/變量計數需要讀的讀者為0writerCount = 0;/變量計數需要寫的寫者為0dbReadiiig = false;/表示沒有讀者正在讀入 dbWritiiig = false;/表示沒有寫者正在寫入public static void nappiiig() /控制睡眠的時間int sleepTime = (int) (NAP_TIME * Ma th. rand om();/ 睡眠時間隨機try Thread .sleep(sleepTime * 1000)

11、; catch (Exception e) e.printStackTrace();public synchioxiized int staitRead() /控制讀者開始讀 if(dbReading = false) /當沒有讀者在讀時 while (writerCount > 0) /當有寫者想寫時 g System.out.printlnC'reader is waiting"); wait();/ 等待 catch (Exception e) System.out.println(e.toString(); e.printStackTrace();+reader

12、Count;/in求讀入的讀者數加一if (readerCount = 1) dbReadiiig = true;/標明有讀者正在讀return readerCount;public syncluoiiized int endReading() /控制讀者結束讀入readerCount;if (readerCount = 0) dbReadiiig = false;notifyAHO;/釋放出空間給其他的線程System.out.println(Hone reader is done, reading Count=n + readerCount);return readerCount;publ

13、ic syncluoiiized void staitWriting() /控制寫者開始進入寫+writerCount;/想寫的寫者數加一while (dbReading = tme | dbWriting = tme) /當有讀者在 讀或者有寫者在寫時都得等待好System.out.println(HWriter is waiting");wait(); catch (Exception e) System.out.println(e.toString();dbWriting = tme;public syncluoiiized void endWriting() /控制寫者結束寫

14、入writerCount;dbWriting = false;System.out.println(Hone writer is done, writing Count=n + writerCount);notifyAll();Reader 類:package rw;* author xzv*/public class Reader extends Thread private Database server;/設置一個Database變量用來控制該讀者private int readerNum;/設置該讀者的標志public Reader(int r, Database db) reader

15、Num = r;seiver = db;Ovemdepublic void mn() int c;while (tme) System.out.println(nreader n + readerNum +11 issleeping11);Database.napping();/表明讀者正在睡眠狀態(tài)System.out.println(nreader 11 + readerNum + n wants to read");c = sei-verstartReaciO;/讀者開始i青求讀入匚作System.out.println(Hreader H + readerNum + "

16、; is reading.Count=n + c);Database.napping();/讀者處于工作階段c = server.endReadingO;/ 讀者結束工作System.out.println(HIt is reader n + readerNum + n who has done reading according to count=n + c);Writer 類:package rw;* author xzv*/public class Writer extends Thread private Database seiver;/設置一個Database變量用來控制該寫者pr

17、ivate int writerNum;/設置該寫者的標志public Writer(int w, Database db) writerNum = w;seiver = db;Overridepublic void mn() while (true) System.out.println(nWriter n + writerNum + n is sleeping11);Database.napping();/表明寫者正在睡眠狀態(tài)System.out.println(HWriter u + writerNum + 11 wants to writen);seiver. start Writin

18、g();/寫者開始請求讀入1 :作System.out.println(HWriter H + writerNum + n is writing11);Database.napping();/寫者處于工作階段seiverendWritingO;/ 寫者結束工作System.out.println(HIt is Writer n + writerNum + 11 who has done writing ”);讀者:開始v讀者:開始v請求讀入,請求讀入的讀者數加一等待 讀入讀完,請求讀入的讀者實驗當堂所要完成的事情:解決編譯和運行出現的問題.編譯過程中出現的問題及其相應解決:1.一個讀者或者寫者工作完時無法釋放出空間給其他人解決:用了 notifyall()方法,最開始只知道notify。方法,要釋放出空間給 所有人平等使用權利那么就必須用notifyallO方法.運行過程中出現的問題及其相應解決:1.實現了寫者優(yōu)先但是沒有實現讀讀允許 解決:加了一

溫馨提示

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

評論

0/150

提交評論