计算机操作系统理发师问题JAVA_第1页
计算机操作系统理发师问题JAVA_第2页
计算机操作系统理发师问题JAVA_第3页
计算机操作系统理发师问题JAVA_第4页
计算机操作系统理发师问题JAVA_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程实验报告计算机操作系统理发师问题2013级*题目 姓名 学号 年级专业 指导教师201*年 1* 月 30 日题目假设有个理发店,只有一个理发师和 N张可供顾客等待理发的椅子,如果没有顾客, 则理发师睡觉,如果有一个顾客进入理发店发现理发师在睡觉,则把他叫醒,试用信号 量设计一个协调理发师和顾客的程序。二 PV 操作伪代码C语言的伪代码实现:int waiting=0 ; / 等候理发的顾客数int chairs=n ; / 为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() while(TRUE); / 理完一人,还有

2、顾客吗 ? P(cutomers); / 若无顾客 , 理发师睡眠 P(mutex); / 进程互斥waiting -= 1;/ 等候顾客数少一个 V(barbers); / 理发师去为一个顾客理发 V(mutex); / 开放临界区 cut-hair(); / 正在理发customer() P(mutex); / 进程互斥if(waiting) waiting += 1; / 等候顾客数加 1 V(customers); / 必要的话唤醒理发师 V(mutex); / 开放临界区P(barbers); / 无理发师 , 顾客坐着养神 get-haircut( ); / 一个顾客坐下等理 /

3、else V(mutex); / 人满了 , 离开三 程序流程图 顾客模块:理发师模块:四 源程序的实现因为本人对 C+的多线程库函数不了解,于是使用 JAVA实现理发师问题,假设有 5 张可供顾客理发的椅子:package com.swxy;import java.util.concurrent.Semaphore;/ 导入 Semaphore ,用于控制进程同步互斥的量。public class BarberShop staticintcnt = 0; /顾客staticintMAX = 5; /假设 5 张可供顾客理发的椅子staticintbusy =0;staticSemaphore

4、mutex= new Semaphore(1); / 临界区互斥访问信号量 ( 二进制信号量 ) ,相当于互斥锁public static voidmain(String args)throwsInterruptedException 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.1

5、spublic synchronized boolean isFull() if ( cnt = MAX) return true ;return false ;public synchronized boolean isEmpty() if ( cnt = 0) return true ;return false ;public synchronized boolean isBusy() if ( busy = 1) return true ;return false ;throws InterruptedException public void Gobar( int index)Syst

6、em. out .println( 顾客 + index + 来了 ); cnt +;/ 判断是否满 if (isFull() System. out .println( 没有可供顾客等待的椅子了 , + 顾客 开了 );cnt -; else if ( busy = 1) System. out .println( 顾客 + index + 正在等待理发师mutex .acquire(); / 信号量减操作,防止其他进程再进入 synchronized ( this ) while ( busy = 1) / 若有人在理发,则等待 wait();if ( cnt = 1) System. o

7、ut .println( 现在理发店只有顾客 + index + , + index + 离);理发师是清醒的 );busy = 1;System.out .println( 顾客 + index + 正在理发 Thread.sleep (1000);System.out .println( 顾客 + index + 离开了 );cnt -;mutexrelease(); /信号量加操作synchronized ( this) busy = 0;notify(); / 唤醒if ( cnt = 0) System. out .println( 没有顾客了,理发师开始睡觉 ); class Ba

8、rberimplements Runnable BarberShop ob;int indexpublic 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 block e.printStackTrace();五 运行结果顾客 1 来了现在理发店只有顾客 1, 理发师是清醒

9、的, 顾客 6 离开了, 顾客 7 离开了, 顾客 8 离开了, 顾客 10 离开了顾客 1 正在理发 顾客 2 来了 顾客 2 正在等待理发师 顾客 3 来了 顾客 3 正在等待理发师 顾客 4 来了 顾客 4 正在等待理发师 顾客 1 离开了 顾客 2 正在理发 顾客 5 来了 顾客 5 正在等待理发师 顾客 6 来了 没有可供顾客等待的椅子了 顾客 7 来了 没有可供顾客等待的椅子了 顾客 8 来了 没有可供顾客等待的椅子了 顾客 2 离开了 顾客 3 正在理发 顾客 9 来了 顾客 9 正在等待理发师 顾客 10 来了 没有可供顾客等待的椅子了, 顾客 11 离开了, 顾客 13 离开

10、了, 顾客 14 离开了, 顾客 15 离开了, 顾客 17 离开了, 顾客 18 离开了, 顾客 19 离开了顾客 11 来了没有可供顾客等待的椅子了 顾客 3 离开了 顾客 4 正在理发 顾客 12 来了 顾客 12 正在等待理发师 顾客 13 来了 没有可供顾客等待的椅子了 顾客 14 来了 没有可供顾客等待的椅子了 顾客 15 来了 没有可供顾客等待的椅子了 顾客 4 离开了 顾客 5 正在理发 顾客 16 来了 顾客 16 正在等待理发师 顾客 17 来了 没有可供顾客等待的椅子了 顾客 18 来了 没有可供顾客等待的椅子了 顾客 19 来了 没有可供顾客等待的椅子了 顾客 5 离开了 顾客 9 正在理发 顾客 20 来了 顾客 20 正在等待理发师顾客 9 离开了顾客 12 正在理发顾客 12 离开了顾客 16 正在理发顾客 16 离开了现在理发店只有顾客 20,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论