收藏 分销(赏)

计算机操作系统理发师问题-JAVA.doc

上传人:二*** 文档编号:4514796 上传时间:2024-09-26 格式:DOC 页数:10 大小:455KB 下载积分:5 金币
下载 相关 举报
计算机操作系统理发师问题-JAVA.doc_第1页
第1页 / 共10页
本文档共10页,全文阅读请下载到手机保存,查看更方便
资源描述
- . 课程实验报告 题 目 计算机操作系统理发师问题 姓 名 * 学 号2021 *** 年级专业2021级* 指导教师 * 华 201*年1*月 30 日 一 题目 假设有个理发店,只有一个理发师和N可供顾客等待理发的椅子,如果没有顾客,那么理发师睡觉,如果有一个顾客进入理发店发现理发师在睡觉,那么把他叫醒,试用信号量设计一个协调理发师和顾客的程序。 二 PV操作伪代码 C语言的伪代码实现: int waiting=0 ; //等候理发的顾客数 int chairs=n; //为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() {   while(TRUE); //理完一人,还有顾客吗?   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( ); //一个顾客坐下等理/ } else V(mutex); //人满了,离开  } 三 程序流程图 顾客模块: 理发师模块: 四 源程序的实现 因为本人对C++的多线程库函数不了解,于是使用JAVA实现理发师问题,假设有5可供顾客理发的椅子: package .swxy; import java.util.concurrent.Semaphore;//导入Semaphore,用于控制进程同步互斥的量。 publicclass BarberShop { staticintt = 0;// 顾客 staticintMAX = 5;// 假设5可供顾客理发的椅子 staticintbusy = 0; static Semaphore mutex = new Semaphore(1);// 临界区互斥信号量(二进制信号量),相当于互斥锁。 publicstaticvoid main(String 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.1s } } publicsynchronizedboolean isFull() { if (t == MAX) { returntrue; } returnfalse; } publicsynchronizedboolean isEmpty() { if (t == 0) { returntrue; } returnfalse; } publicsynchronizedboolean isBusy() { if (busy == 1) { returntrue; } returnfalse; } publicvoid Gobar(int index) throws InterruptedException { System.out.println("顾客 " + index + " 来了"); t++; // 判断是否满 if (isFull()) { System.out.println("没有可供顾客等待的椅子了," + "顾客 " + index + " 离开了"); t--; } else { if (busy == 1) { System.out.println("顾客" + index + " 正在等待理发师"); } mutex.acquire();// 信号量减操作,防止其他进程再进入 synchronized (this) { while (busy == 1) { // 假设有人在理发,那么等待 wait(); } } if (t == 1) { System.out.println("现在理发店只有顾客" + index + ",理发师是清醒的"); } busy = 1; System.out.println("顾客" + index + " 正在理发"); Thread.sleep(1000); System.out.println("顾客" + index + " 离开了"); t--; mutex.release();// 信号量加操作 synchronized (this) { busy = 0; notify();// 唤醒 } if (t == 0) { System.out.println("没有顾客了,理发师开场睡觉"); } } } } class Barber implements Runnable { BarberShop ob; intindex; public Barber(BarberShop ob, int i) { this.ob = ob; index = i; } publicvoid run() { // TODO Auto-generated method stub try { ob.Gobar(index); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 五 运行结果 顾客 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 离开了 顾客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 离开了 顾客16 正在理发 顾客16 离开了 现在理发店只有顾客20,理发师是清醒的 顾客20 正在理发 顾客20 离开了 没有顾客了,理发师开场睡觉 运行截图: 六 实验总结 本次课程设计完成了多进程同步方法理发师问题全部过程,结果满足设计要求,验证无误。设计过程中也遇到不少困难,尤其是关于多线程程序的设计实现。让我明白了自己的缺乏之处,在C++语言这一块自己存在着短板。 . word.zl.
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服