计算机操作系统理发师问题JAVA.doc
- 文档编号:1264167
- 上传时间:2023-04-30
- 格式:DOC
- 页数:8
- 大小:445KB
计算机操作系统理发师问题JAVA.doc
《计算机操作系统理发师问题JAVA.doc》由会员分享,可在线阅读,更多相关《计算机操作系统理发师问题JAVA.doc(8页珍藏版)》请在冰点文库上搜索。
课程实验报告
题目计算机操作系统理发师问题
姓名潘*
学号2013***
年级专业2013级*
指导教师彭*华
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张可供顾客理发的椅子:
packagecom.swxy;
importjava.util.concurrent.Semaphore;//导入Semaphore,用于控制进程同步互斥的量。
publicclassBarberShop{
staticintcnt=0;//顾客
staticintMAX=5;//假设5张可供顾客理发的椅子
staticintbusy=0;
staticSemaphoremutex=newSemaphore
(1);//临界区互斥访问信号量(二进制信号量),相当于互斥锁。
publicstaticvoidmain(Stringargs[])throwsInterruptedException{
BarberShopbar=newBarberShop();
for(inti=1;i<=20;i++){//假设一共有20个顾客来访
newThread(newBarber(bar,i)).start();
Thread.sleep((int)(400-Math.random()*300));//使得当前线程休眠随机0-0.1s
}
}
publicsynchronizedbooleanisFull(){
if(cnt==MAX){
returntrue;
}
returnfalse;
}
publicsynchronizedbooleanisEmpty(){
if(cnt==0){
returntrue;
}
returnfalse;
}
publicsynchronizedbooleanisBusy(){
if(busy==1){
returntrue;
}
returnfalse;
}
publicvoidGobar(intindex)throwsInterruptedException{
System.out.println("顾客"+index+"来了");
cnt++;
//判断是否满
if(isFull()){
System.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("现在理发店只有顾客"+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.println("没有顾客了,理发师开始睡觉");
}
}
}
}
classBarberimplementsRunnable{
BarberShopob;
intindex;
publicBarber(BarberShopob,inti){
this.ob=ob;
index=i;
}
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
ob.Gobar(index);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
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++语言这一块自己存在着短板。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 理发师 问题 JAVA
![提示](https://static.bingdoc.com/images/bang_tan.gif)