哲学家就餐问题

来源:互联网 发布:网络推广活动方案 编辑:程序博客网 时间:2024/05/21 14:47

哲学家就餐问题

该问题的基本描述是指定5个哲学家(也可以是任意数目)。这些哲学家将花部分时间思考,花部分时间就餐。当他们思考的时候,不需要共享任何资源;但是当他们就餐时,将使用有限数量的餐具。进而我们可以把问题描述为:

5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一只筷子,哲学家平时进行思考,只有当他们饥饿时,才拿起筷子吃饭
规定每个哲学家只能先取其左边筷子,然后取其右边筷子,然后才可以吃饭。

解决办法:
  1、添加一个服务生,只有当经过服务生同意之后才能拿筷子,服务生负责避免死锁发生。
  2、每个哲学家必须确定自己左右手的筷子都可用的时候,才能同时拿起两只筷子进餐,吃完之后同时放下两只筷子。
  3、规定每个哲学家拿筷子时必须拿序号小的那只,这样最后一位未拿到筷子的哲学家只剩下序号大的那只筷子,不能拿起,剩下的这只筷子就可以被其他哲学家使用,避免了死锁。这种情况不能很好的利用资源。 
代码实现:实现第二种方案

class MyPhioThread implements Runnable{


private int name;
private ChopStick ch;

public MyPhioThread(int name,ChopStick ch){
this.name = name;
this.ch = ch;
}
public void thinging(){
System.out.println("I am thinging:"+name);
try {
Thread.sleep(1000);//模拟思考
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void eating(){
System.out.println("I am eating:"+name);
try {
Thread.sleep(1000);//模拟吃饭,会占用一段时间资源
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
thinging();
if(ch.GetChop(name)){
eating();
}
ch.FreeChop(name);

}
}

}


class  ChopStick{

private boolean[] usechoick = {false,false,false,false,false};

public synchronized boolean GetChop(int name){
int i = name;
while(usechoick[i] || usechoick[(i+1)%5]){
//此时说明筷子被占有,等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
usechoick[i] = true;
usechoick[(i+1)%5] = true;
//System.out.println("============"+usechoick.toString());
return true;
}

public synchronized void FreeChop(int name){
int i = name;
usechoick[i] = false;
usechoick[(i+1)%5] = false;
//System.out.println("============"+usechoick.toString());
notifyAll();
}
}


public class Text_729 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ChopStick ch = new ChopStick();
new Thread(new MyPhioThread(0,ch)).start();
new Thread(new MyPhioThread(1,ch)).start();
new Thread(new MyPhioThread(2,ch)).start();
new Thread(new MyPhioThread(3,ch)).start();
new Thread(new MyPhioThread(4,ch)).start();

        }

}

原创粉丝点击