题目介绍
某博物馆最多可容纳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();
}
}
}