教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 公文资料 >

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

来源:网络收集 时间:2026-09-08
导读: 计算机操作系统理发师问题-JAVa实现 课程实验报告 题 目 计算机操作系统理发师问题 姓 名 潘 * 学 号 2013 *** 年级专业 2013级* 指导教师 彭 * 华 201*年 1*月 30 日 计算机操作系统理发师问题-JAVa实现 一 题目 假设有个理发店,只有一个理发师和N张可供顾

计算机操作系统理发师问题-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字,全部文档内容请下载后查看。喜欢就下载吧 ……
计算机操作系统理发师问题-JAVA.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/710819.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)