计算机操作系统理发师问题-JAVA
计算机操作系统理发师问题-JAVa实现
课程实验报告
题 目 计算机操作系统理发师问题 姓 名 潘 * 学 号 2013 *** 年级专业 2013级* 指导教师 彭 * 华
201*年 1*月 30 日
计算机操作系统理发师问题-JAVa实现
一 题目
假设有个理发店,只有一个理发师和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); //人满了,离开 }
三 程序流程图
顾客模块:
计算机操作系统理发师问题-JAVa实现
理发师模块:
四 源程序的实现
计算机操作系统理发师问题-JAVa实现
因为本人对C++的多线程库函数不了解,于是使用JAVA实现理发师问题,假设有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(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
}
public void Gobar(int index) throws InterruptedException { public synchronized boolean isBusy() { }
if (busy == 1) { }
return false;
return true;
public synchronized boolean isEmpty() { }
if (cnt == 0) { }
return false;
return true;
public synchronized boolean isFull() { }
if (cnt == MAX) { }
return false;
return true;
}
计算机操作系统理发师问题-JAVa实现
System.out.println("顾客 " + index + " 来了"); cnt++;
// 判断是否满
if (isFull()) {
System.out.println("没有可供顾客等待的椅子了," + "顾客 " + index + " 离cnt--;
if (busy == 1) {
System.out.println("顾客" + index + " 正在等待理发师"); }
mutex.acquire();// 信号量减操作,防止其他进程再进入 synchronized (this) { }
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("没有顾客了,理发师开始睡觉"); }
while (busy == 1) { }
// 若有人在理发,则等待 wait();
开了"); }
}
}
} else {
class Barber implements Runnable {
BarberShop ob; int index;
计算机操作系统理发师问题-JAVa实现
}
public void run() { }
// TODO Auto-generated method stub try { }
ob.Gobar(index);
// TODO Auto-generated catch block e.printStackTrace();
} catch (InterruptedException e) { this.ob = ob; index = i;
}
五 运行结果
顾客 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 离开了
计算机操作系统理发师问题-JAVa实现
顾客 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 离开了
没有顾客了,理发师开始睡觉
运行截图:
计算机操作系统理发师问题-JAVa实现
六 实验总结
本次课程设计完成了多进程同步方法理发师问题全部过程,结果满足设计要求,验证无误。设计过程中也遇到不少困难,尤其是关于多线程程序的设计实现。让我明白了自己的不足之处,在C++语言这一块自己存在着短板。
…… 此处隐藏:1885字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [公文资料]市场营销专员岗位职责
- [公文资料]综合部经理岗位职责
- [公文资料]会计助理岗位职责
- [公文资料]林业站站长职责
- [公文资料]菜品研发部岗位职责
- [公文资料]街道综治办工作职责
- [公文资料]酒店前台的工作职责
- [公文资料]销售部经理岗位职责
- [公文资料]工程部副经理岗位职责
- [公文资料]手术室护士工作职责
- [公文资料]银行客户经理职责
- [公文资料]汽车4s店市场专员职责
- [公文资料]服装店长工作职责
- [公文资料]采购总监岗位职责
- [公文资料]大学行政秘书工作职责
- [公文资料]学校财务人员岗位职责
- [公文资料]财务统计员岗位职责
- [公文资料]物业工程主管工作职责
- [公文资料]公司后勤工作职责
- [公文资料]采矿工程师岗位职责
- 门面出租合同样板(门面出租的合同)
- 自用房屋租赁合同 自住房租房合同(汇总
- 最新酒店劳动合同管理制度(11篇)(酒店
- 2025年无产权车库买卖合同实用(14篇)(
- 建筑工程农民工劳动合同十五篇(通用)(
- 最新深圳标准劳动合同 深圳劳动合同如
- 解除劳动合同通知书(实用6篇)(解除劳动
- 2025年二手房屋买卖合同范围精选(二十
- 最新融资贷款居间合同大全(22篇)(融资
- 2025年个人二手房屋买卖合同协议书四篇
- 2025年果树苗木买卖合约书 签订果树苗
- 广东省劳动合同书填写(21篇)(广东省劳
- 最新餐饮行业没有劳动合同 劳动法餐饮
- 农村土地买卖合同(汇总21篇)(农村土地
- 最新房屋转租合同模版21篇(通用)(标准
- 2025年进口合同号查询五篇(大全)(进口
- 农村建房包工包料合同(通用8篇)(农村建
- 2025年安装监控合同协议书(15篇)(2025
- 2025年企业租赁经营合同(模板9篇)(2025
- 最新郊区土地租赁合同(优质23篇)(最新




