当前位置:文档之家› 哲学家进餐问题代码

哲学家进餐问题代码

哲学家进餐问题代码(JAVA)
(2010-10-12 15:24:12)
转载
标签:
分类:Java
it
问题描述:
一个哲学家围坐在一张圆桌周围,每个哲学家面前都有一碟通心面。

由于面条很滑,所以
要两把叉子才能夹住。

相邻两个碟子之间有一把叉子。

哲学家的生活包括两种活动:即吃饭和思考。

当一个哲学家觉得饿时,他就试图分两次去
取他左边和右边的叉子,每次拿一把,但不分次序。

如果成功地获得了两把叉子,他就开
始吃饭,吃完以后放下叉子继续思考。

问题是:
为每一个哲学家写一段程序描述其行为。

要求不能死锁。

class kuai{
String name;
boolean Enable = true;
public kuai(String name)
{
= name;
}
public synchronized void pickup()
{
this.Enable =false;
}
public synchronized void putdown()
{
this.Enable =true;
this.notifyAll();
}
}
class Philosopher extends Thread
{
String name;
kuai left;
kuai right;
public Philosopher(String name, kuai l, kuai r) {
= name;
left = l;
right = r;
}
public void run()
{
if(left.Enable)
{
left.pickup();
}
else
{
while(!left.Enable)
{
try
{
System.out.println(name + " 在等待 "+);
Thread.sleep(500);
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
System.out.println(name + " 眼明手快,以迅雷不及掩耳之势一把抓起"+);
try
{
Thread.sleep(500);
}catch (InterruptedException e)
{
e.printStackTrace();
}
if(right.Enable)
{
right.pickup();
}
else
{
while (!left.Enable)
{
try
{
System.out.println(name + "在等待 "+);
Thread.sleep(500);
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
System.out.println(name + " 眼明手快,以迅雷不及掩耳之势一把抓起"+);
System.out.println(name + " 左右开弓,狼吞虎咽起来");
try
{
Thread.sleep(2000);
}catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(name + " 酒足饭饱,打了个饱嗝,心满意足的放下了"++" 和 " +);
left.putdown();
right.putdown();
}
}
public class Eat1
{
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号");
Philosopher p1 = new Philosopher("老大", k1, k2); Philosopher p2 = new Philosopher("老二", k2, k3); Philosopher p3 = new Philosopher("老三", k3, k4); Philosopher p4 = new Philosopher("老四", k4, k5); Philosopher p5 = new Philosopher("老幺", k5, k1); p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
}
}。

相关主题