📄 哲学家进餐问题.txt
字号:
哲学家进餐问题也是一个经典的同步问题,它是由Dijkstra提出并解决的。哲学家进餐问题是这样的:5个哲学家以思考、吃饭交替进行的方式生活,他们共享一张周围有5把椅子的圆桌,每人一把椅子,在桌子上摆有5个饭碗和5只筷子。当一个哲学家思考时,他不与邻座同事发生联系。当一哲学家饿了,他就试图拿起他左右两边的筷子吃饭。显然,他不能拿起已抓在他的邻座手中的筷子,于是,他可能只拿到一只甚至一只筷子也拿不到。当一个饥饿的哲学家得到了两只筷子,他就可以吃饭。当他用饭毕,就放下筷子并再次开始思考。5个哲学家共享5支筷子,最多只能不相邻的两个哲学家同时就餐请问:是否有死锁的可能?
在多道程序设计环境下,进程同步问题十分重要,其中“哲学家进餐问题”是较有代表性的。通过对该问题的研究学习和实践,可以帮助我们更好的理解和掌握临界资源、进程同步的概念和实现方法。
正好手头有答案,前两天刚做的,但是…………
我是用JAVA做的:P
public class kuai {
String name;
boolean Enable = true;
public kuai(String name) {
this.name = name;
}
public synchronized void pickup(){
try {
while(Enable==false){
this.wait();
}
this.Enable =false;
}
catch (Exception e) {
}
}
public synchronized void putdown() {
this.Enable =true;
this.notifyAll();
}
public static void main(String args[]) {
kuai k1 = new kuai("筷子1号");
kuai k2 = new kuai("筷子2号");
kuai k3 = new kuai("筷子3号");
kuai k4 = new kuai("筷子4号");
kuai k5 = new kuai("筷子5号");
People p1 = new People("老大", k1, k2);
People p2 = new People("老二", k2, k3);
People p3 = new People("老三", k3, k4);
People p4 = new People("老四", k4, k5);
People p5 = new People("老幺", k5, k1);
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
}
}
class People extends Thread {
String name;
kuai left;
kuai right;
public People(String name, kuai l, kuai r) {
this.name = name;
left = l;
right = r;
}
public void run() {
left.pickup();
System.out.println(name + " 眼明手快,以迅雷不及掩耳之势一把抓起 "+left.name);
right.pickup();
System.out.println(name + " 眼明手快,以迅雷不及掩耳之势一把抓起 "+right.name);
System.out.println(name + " 左右开弓,狼吞虎咽起来");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
System.out.println(name + " 酒足饭饱,打了个饱嗝,心满意足的放下了 "+left.name+" 和 " +right.name);
left.putdown();
right.putdown();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -