public class Dinning {
public static void main(String[] args) {
KuaiZi k1 = new KuaiZi("筷子一号");
KuaiZi k2 = new KuaiZi("筷子二号");
KuaiZi k3 = new KuaiZi("筷子三号");
Philosopher p1 = new Philosopher("哲学家A", k1, k2);
Philosopher p2 = new Philosopher("哲学家B", k2, k3);
Philosopher p3 = new Philosopher("哲学家C", k3, k1);
p1.start();
p2.start();
p3.start();
}
}
// 筷子类
class KuaiZi {
String name;
boolean Enable = true;// 构造方法
public KuaiZi(String name) {
this.name = name;
}
// 放下筷子
public synchronized void putdown() {
this.Enable = true;
this.notifyAll();
}
// 去取筷子
public synchronized boolean pickup() { // 如果取到筷子了,就返回true,否则返回false
try {
// while (Enable == false) { //不在这里做等待,把等待放到Philosopher里面
// this.wait();
// }
if (this.Enable) // 筷子空闲
{
this.Enable = false; // 取到筷子
return true;
}
} catch (Exception e) {
}
return false; // 筷子不空闲
}
}
// 哲学家类:
class Philosopher extends Thread {
String name;
KuaiZi left;
KuaiZi right;
public Philosopher(String name, KuaiZi l, KuaiZi r) {
this.name = name;
left = l;
right = r;
}
public void run() {// 吃饭前的思考,时间是随机的
try {
System.out.println(name + "在思考中。。。");
Thread.sleep((long) (Math.random()));// 思考时间
System.out.println(name + "思考结束!");
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true)// 一直处于等待那筷子状态,如果2只手都拿到了就进餐,否则一直等待
{
boolean leftflag = left.pickup();// 左手拿筷子
while (!leftflag) // 没有拿到就等待一段时间再拿
{
try {
sleep(10);
} catch (Exception ex) {
}
leftflag = left.pickup();
}
System.out.println(name + "抓起" + left.name);
boolean rightflag = right.pickup();// 右手开始拿筷子
if (rightflag)// 拿到了,不在等待,开始吃
{
System.out.println(name + "抓起" + right.name);
break;
} else// 没拿到,把左手已经拿到的筷子放下继续等待
{
System.out.println(name + "没有拿到" + right.name);
left.putdown();
System.out.println(name + "放下" + left.name + "继续等待...");
try {
sleep(10);
} catch (Exception ex) {
}
}
}
System.out.println(name + "拿到两支筷子开吃");
try {
Thread.sleep(1);// 吃饭时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "吃饱之后放下了" + left.name + "和" + right.name
+ "!");
left.putdown();
right.putdown();
}
}
运行一下结果:
农民家A在思考中。。。
哲学家B在思考中。。。
哲学家C在思考中。。。
哲学家C思考结束!
哲学家C抓起筷子三号
哲学家C抓起筷子一号
哲学家C拿到两支筷子开吃
哲学家B思考结束!
哲学家B抓起筷子二号
哲学家B没有拿到筷子三号
哲学家B放下筷子二号继续等待...
农民家A思考结束!
哲学家C吃饱之后放下了筷子三号和筷子一号!
农民家A抓起筷子一号
农民家A抓起筷子二号
农民家A拿到两支筷子开吃
农民家A吃饱之后放下了筷子一号和筷子二号!
哲学家B抓起筷子二号
哲学家B抓起筷子三号
哲学家B拿到两支筷子开吃
哲学家B吃饱之后放下了筷子二号和筷子三号!