哲学家就餐问题
来源:互联网 发布:网络推广活动方案 编辑:程序博客网 时间: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();
}
}
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题 锁
- 哲学家就餐问题
- 哲学家就餐问题
- 关于哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 多线程--哲学家就餐问题
- Bagging 与Boosting 特点分析
- HDU1282 最简单的计算机
- 利用可变参数实现求平均值
- HDU-1284-钱币兑换问题(完全背包)
- 单例模式的懒汉模式和饿汉模式
- 哲学家就餐问题
- 如何设置无需fn直接按F1~F10(HP Pavilion Notebook )
- 杭电acm—1013 Digital Roots
- 机器学习算法(3:决策树算法)
- HTML5和css3实例:制作HTML5验证的网页表单
- OD破解基本知识(纯文字版)
- Spring参数解析器源码分析
- ROS之tf空间坐标变换浅析
- Java 截取字符串