哲学家进餐问题代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哲学家进餐问题代码(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();
}
}