哲学家就餐问题

哲学家就餐问题:
1.问题描述:5个哲学家使用5只筷子吃饭,每个哲学家只能使用其左手和右手边的筷子,哲学家必须同时拿到两双筷子才能吃到饭,问如何分配筷子才能使每个哲学家都能吃到饭。
2.解决思路:让每个哲学家先拿其左手边的筷子,如果左手边没筷子,则等待,否则拿起该筷子,然后判断右手边是否有筷子,如果有,则进食,否则,放下左手边筷子并等待。因为拿筷子的事件是互斥的,所以要在拿筷子时给筷子加上锁。



class Chopstick
{
private int num;
private boolean flag;


public int getNum()
{
return num;
}
public Chopstick(int num,boolean flag)
{
this.num=num;
this.flag=flag;
}


public void setFlag(boolean flag)
{
this.flag=flag;
}
public boolean isUsed()
{
return flag;
}
}


class Philosopher implements Runnable
{
private String name;
private Chopstick chopstick_l;  //左手边筷子
private Chopstick chopstick_r;  //右手边筷子
private boolean isHungry=true;  //表示是否饥饿


public Philosopher(String name,Chopstick chopstick_l,Chopstick chopstick_r)
{
this.name=name;
this.chopstick_l=chopstick_l;
this.chopstick_r=chopstick_r;
}


public void run()
{
while(isHungry)
{
if(!chopstick_l.isUsed())  //如果左手边筷子空闲
{
synchronized(chopstick_l)  //给左手变筷子加锁
{
chopstick_l.setFlag(true);  //哲学家拿起左手边筷子
System.out.println("哲学家"+name+"拿起了"+chopstick_l.getNum()+"号筷子");
if(!chopstick_r.isUsed())  //如果右手边筷子空闲
{
synchronized(chopstick_r)  //给右手边筷子枷锁
{
chopstick_r.setFlag(true);  //哲学家拿起右手边筷子
System.out.println("哲学家"+name+"拿起了"+chopstick_r.getNum()+"号筷子");
chopstick_l.setFlag(false);
chopstick_r.setFlag(false);
System.out.println("哲学家"+name+"吃完并放下了筷子");
isHungry=false;
}
}
else  //如果右手边筷子正被使用
{
chopstick_l.setFlag(false);  //哲学家放下左手边筷子
System.out.println("哲学家"+name+"放下了"+chopstick_l.getNum()+"号筷子");
}
}
}
}
}
}


public class PhilosTest 
{
public static void main(String[] args) 
{
Chopstick[] chopsticks=new Chopstick[5];
Philosopher[] philosophers=new Philosopher[5];


for(int i=0;i<5;++i)
{
chopsticks[i]=new Chopstick(i,false);
}


for(int i=0;i<5;++i)
{
if(i==4)
{
philosophers[i]=new Philosopher(Integer.toString(i),chopsticks[i],chopsticks[0]);
}
else
{
philosophers[i]=new Philosopher(Integer.toString(i),chopsticks[i],chopsticks[i+1]);
}
}


for(int i=0;i<5;++i)
{
new Thread(philosophers[i]).start();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值