計算機操作系統理發師問題JAVA_第1頁
計算機操作系統理發師問題JAVA_第2頁
計算機操作系統理發師問題JAVA_第3頁
計算機操作系統理發師問題JAVA_第4頁
計算機操作系統理發師問題JAVA_第5頁
已閱讀5頁,還剩3頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 課程實驗報告 題 目 計算機操作系統理發師問題 姓 名 潘 * 學 號 2013 * 年級專業 2013級* 指導教師 彭 * 華 201*年 1*月 30 日一 題目假設有個理發店,只有一個理發師和N張可供顧客等待理發的椅子,如果沒有顧客,則理發師睡覺,如果有一個顧客進入理發店發現理發師在睡覺,則把他叫醒,試用信號量設計一個協調理發師和顧客的程序。二 PV操作偽代碼C語言的偽代碼實現:int waiting=0 ; /等候理發的顧客數 int chairs=n; /為顧客準備的椅子數 semaphore customers=0,&

2、#160;barbers=0,mutex=1; barber()  while(TRUE); /理完一人,還有顧客嗎?  P(cutomers); /若無顧客,理發師睡眠  P(mutex); /進程互斥  waiting -= 1;/等候顧客數少一個  V(barbers); /理發師去為一個顧客理發  V(mutex); /開放臨界區  cut-hair(); /正在理發  customer()  P(mutex

3、); /進程互斥  if(waiting) waiting += 1; / 等候顧客數加1  V(customers); /必要的話喚醒理發師 V(mutex); /開放臨界區 P(barbers); /無理發師, 顧客坐著養神 get-haircut( ); /一個顧客坐下等理/ else V(mutex); /人滿了,離開 三 程序流程圖顧客模塊:理發師模塊:四 源程序的實現因為本人對C+的多線程庫函數不了解,于是使用JAVA實現理

4、發師問題,假設有5張可供顧客理發的椅子:package com.swxy;import java.util.concurrent.Semaphore;/導入Semaphore,用于控制進程同步互斥的量。public class BarberShop static int cnt = 0;/ 顧客static int MAX = 5;/ 假設5張可供顧客理發的椅子static int busy = 0;static Semaphore mutex = new Semaphore(1);/ 臨界區互斥訪問信號量(二進制信號量),相當于互斥鎖。public static void main(Stri

5、ng args) throws InterruptedException BarberShop bar = new BarberShop();for (int i = 1; i <= 20; i+) / 假設一共有20個顧客來訪new Thread(new Barber(bar, i).start();Thread.sleep(int) (400 - Math.random() * 300);/ 使得當前線程休眠 隨機0-0.1spublic synchronized boolean isFull() if (cnt = MAX) return true;return false;pub

6、lic synchronized boolean isEmpty() if (cnt = 0) return true;return false;public synchronized boolean isBusy() if (busy = 1) return true;return false;public void Gobar(int index) throws InterruptedException System.out.println("顧客 " + index + " 來了");cnt+;/ 判斷是否滿if (isFull() System.

7、out.println("沒有可供顧客等待的椅子了," + "顧客 " + index + " 離開了");cnt-; else if (busy = 1) System.out.println("顧客" + index + " 正在等待理發師");mutex.acquire();/ 信號量減操作,防止其他進程再進入synchronized (this) while (busy = 1) / 若有人在理發,則等待wait();if (cnt = 1) System.out.println(&qu

8、ot;現在理發店只有顧客" + index + ",理發師是清醒的");busy = 1;System.out.println("顧客" + index + " 正在理發");Thread.sleep(1000);System.out.println("顧客" + index + " 離開了");cnt-;mutex.release();/ 信號量加操作synchronized (this) busy = 0;notify();/ 喚醒if (cnt = 0) System.out.p

9、rintln("沒有顧客了,理發師開始睡覺");class Barber implements Runnable BarberShop ob;int index;public Barber(BarberShop ob, int i) this.ob = ob;index = i;public void run() / TODO Auto-generated method stubtry ob.Gobar(index); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTr

10、ace();五 運行結果顧客 1 來了現在理發店只有顧客1,理發師是清醒的顧客1 正在理發顧客 2 來了顧客2 正在等待理發師顧客 3 來了顧客3 正在等待理發師顧客 4 來了顧客4 正在等待理發師顧客1 離開了顧客2 正在理發顧客 5 來了顧客5 正在等待理發師顧客 6 來了沒有可供顧客等待的椅子了,顧客 6 離開了顧客 7 來了沒有可供顧客等待的椅子了,顧客 7 離開了顧客 8 來了沒有可供顧客等待的椅子了,顧客 8 離開了顧客2 離開了顧客3 正在理發顧客 9 來了顧客9 正在等待理發師顧客 10 來了沒有可供顧客等待的椅子了,顧客 10 離開了顧客 11 來了沒有可供顧客等待的椅子了,

11、顧客 11 離開了顧客3 離開了顧客4 正在理發顧客 12 來了顧客12 正在等待理發師顧客 13 來了沒有可供顧客等待的椅子了,顧客 13 離開了顧客 14 來了沒有可供顧客等待的椅子了,顧客 14 離開了顧客 15 來了沒有可供顧客等待的椅子了,顧客 15 離開了顧客4 離開了顧客5 正在理發顧客 16 來了顧客16 正在等待理發師顧客 17 來了沒有可供顧客等待的椅子了,顧客 17 離開了顧客 18 來了沒有可供顧客等待的椅子了,顧客 18 離開了顧客 19 來了沒有可供顧客等待的椅子了,顧客 19 離開了顧客5 離開了顧客9 正在理發顧客 20 來了顧客20 正在等待理發師顧客9 離開了顧客12 正在理發顧客12 離開了顧

溫馨提示

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

評論

0/150

提交評論