操作系统课程设计--模拟博物馆参观问题

操作系统课程设计--模拟博物馆参观问题

题目介绍

某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一个人通过。

PV原语描述

void vistor () {
	while(还有游客没有参观博物馆) {
		p(empty)   //博物馆内游客容量未满时才可以进入参观
		p(mutex)   //博物馆大门没有被使用才可以进入博物馆
		v(mutex)   //释放大门资源
		参观博物馆
		p(mutex)   //博物馆大门没有被使用才可以离开博物馆
		v(mutex)   //释放大门资源
		v(empty)   //离开博物馆,释放博物馆内游客容量
	}
}

代码描述

package museum;
public class museumapp {
	public museumapp() {
	}
	public static void main(String[] args) {
		Door door = new Door();
		visitor v1 = new visitor(door,1);
		visitor v2 = new visitor(door,2);
		visitor v3 = new visitor(door,3);
		visitor v4 = new visitor(door,4);
		visitor v5 = new visitor(door,5);
		visitor v6 = new visitor(door,6);
		visitor v7 = new visitor(door,7);
		visitor v8 = new visitor(door,8);
		visitor v9 = new visitor(door,9);
		visitor v10 = new visitor(door,10);
		new Thread(v1).start();
		new Thread(v2).start();
		new Thread(v3).start();
		new Thread(v4).start();
		new Thread(v5).start();
		new Thread(v6).start();
		new Thread(v7).start();
		new Thread(v8).start();
		new Thread(v9).start();
		new Thread(v10).start();
	}
}
class Door {
	int num=5;//表示博物馆的容量
	//action 表示游客使用门做的动作,true为进入博物馆,false为离开博物馆
	/*
	 synchronized是Java语言的关键字,可用来给对象和方法或者代码块加锁,
	当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。
	借用synchronized的效果,模拟游客对门的使用
	 */
	public synchronized void usedoor(int id,boolean action) throws InterruptedException {
		if(action) {
			if(this.num==0)
				this.wait();
			
			num--;  //p(empty)
			System.out.println("游客"+id+"进入博物馆");
		}
		else {
			num++;  //v(empty)
			this.notify();
			System.out.println("游客"+id+"离开博物馆");
		}
	}
}
class visitor extends Thread{
	int id;
	Door door=null; 
	visitor(Door door,int id){
		this.door=door;
		this.id=id;
	}
	//public synchronized void run()
	public  void run() {
		//System.out.println(id+"开始运行");
		try {
			door.usedoor(this.id, true);
			Thread.sleep(50);//预览博物馆
			door.usedoor(this.id, false);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

效果截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值