经典回顾:哲学家进餐问题(The Dinning Philosophers Problem)


该问题涉及到五个哲学家,他们交替地进行思考和进餐。他们分别坐在位于一个圆形餐桌周围的五把椅子上,圆桌中央是一碗米饭,餐桌上共有五根筷子,分别摆放在每两个相邻座位的中间。
当哲学家思考时,他不与其他人交谈。当哲学家饥饿时,他将拿起和他相邻的两根筷子进行进餐,但他很可能仅拿到一根,此时旁边的另一根正在他邻居的手中。只有他同时拿到两根筷子时他才能开始进餐。完成进餐后,他将两根筷子分别放回原位,然后再次开始思考。

下面是哲学家进餐问题的Java实现的代码,涉及到线程:

  1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
  2InBlock.gif * 创建日期 2006-4-5
  3ExpandedBlockEnd.gif */

  4 None.gifpackage threadDemo;
  5 None.gif
  6 ExpandedBlockStart.gifContractedBlock.gif class  ChopStick  dot.gif {    //筷子类
  7InBlock.gif    boolean available;
  8ExpandedSubBlockStart.gifContractedSubBlock.gif    ChopStick() dot.gif{
  9InBlock.gif        available=true;  //可以拿起
 10ExpandedSubBlockEnd.gif    }

 11ExpandedSubBlockStart.gifContractedSubBlock.gif    public synchronized void takeup() dot.gif{  //拿起动作
 12ExpandedSubBlockStart.gifContractedSubBlock.gif        while(!available) dot.gif{
 13ExpandedSubBlockStart.gifContractedSubBlock.gif            try dot.gif{
 14InBlock.gif                wait(); 
 15InBlock.gif                System.out.println("哲学家等待另一根筷子");  
 16ExpandedSubBlockStart.gifContractedSubBlock.gif            }
 catch(InterruptedException e) dot.gif{ }
 17ExpandedSubBlockEnd.gif        }

 18InBlock.gif        available=false;
 19ExpandedSubBlockEnd.gif    }

 20InBlock.gif    
 21ExpandedSubBlockStart.gifContractedSubBlock.gif    public synchronized void putdown() dot.gif{  //放下动作
 22InBlock.gif        available=true;
 23InBlock.gif        notify();
 24ExpandedSubBlockEnd.gif    }

 25ExpandedBlockEnd.gif}

 26 None.gif
 27 None.gif
 28 ExpandedBlockStart.gifContractedBlock.gif class  Philosopher extends Thread  dot.gif {   //哲学家类
 29InBlock.gif    ChopStick left, right;  
 30InBlock.gif    int philo_num;  //哲学家编号
 31InBlock.gif    
 32ExpandedSubBlockStart.gifContractedSubBlock.gif    Philosopher (int num, ChopStick c1, ChopStick c2) dot.gif{
 33InBlock.gif        philo_num = num;
 34InBlock.gif        left = c1;
 35InBlock.gif        right = c2;
 36InBlock.gif        setDaemon(true);  //此函数设true时,关闭主线程,子线程也跟着关闭
 37InBlock.gif        //否则,关闭主线程,子线程继续执行
 38ExpandedSubBlockEnd.gif    }

 39InBlock.gif    
 40ExpandedSubBlockStart.gifContractedSubBlock.gif    public void eat() dot.gif{
 41InBlock.gif        left.takeup();
 42InBlock.gif        right.takeup();
 43InBlock.gif        System.out.println("哲学家 " + (philo_num + 1+ " 正在进餐");
 44ExpandedSubBlockEnd.gif    }

 45InBlock.gif    
 46ExpandedSubBlockStart.gifContractedSubBlock.gif    public void think() dot.gif{
 47InBlock.gif        left.putdown();
 48InBlock.gif        right.putdown();
 49InBlock.gif        System.out.println("哲学家 " + (philo_num + 1+ " 正在思考");
 50ExpandedSubBlockEnd.gif    }

 51InBlock.gif    
 52ExpandedSubBlockStart.gifContractedSubBlock.gif    public void run() dot.gif{
 53ExpandedSubBlockStart.gifContractedSubBlock.gif        while(truedot.gif{
 54InBlock.gif            eat();
 55InBlock.gif            
 56ExpandedSubBlockStart.gifContractedSubBlock.gif            try dot.gif{
 57InBlock.gif                sleep(2000);  //吃的时间是2秒
 58ExpandedSubBlockEnd.gif            }

 59ExpandedSubBlockStart.gifContractedSubBlock.gif            catch (InterruptedException e) dot.gif{}
 60InBlock.gif
 61InBlock.gif            think();
 62InBlock.gif            
 63ExpandedSubBlockStart.gifContractedSubBlock.gif            try dot.gif{
 64InBlock.gif                sleep(2000);   //思考的时间也是2秒
 65ExpandedSubBlockEnd.gif            }

 66ExpandedSubBlockStart.gifContractedSubBlock.gif            catch (InterruptedException e) dot.gif{}
 67ExpandedSubBlockEnd.gif        }

 68ExpandedSubBlockEnd.gif    }

 69ExpandedBlockEnd.gif}

 70 None.gif
 71 None.gif
 72 ExpandedBlockStart.gifContractedBlock.gif public   class  Dining  dot.gif {      
 73InBlock.gif    static ChopStick[] chopsticks = new ChopStick[5];  
 74InBlock.gif    static Philosopher[] philos = new Philosopher[5];
 75InBlock.gif    
 76ExpandedSubBlockStart.gifContractedSubBlock.gif    public static void main(String args[]) dot.gif{
 77ExpandedSubBlockStart.gifContractedSubBlock.gif        for (int i = 0; i < 5; i ++ ) dot.gif{
 78InBlock.gif            chopsticks[i] = new ChopStick();
 79ExpandedSubBlockEnd.gif        }

 80InBlock.gif        
 81ExpandedSubBlockStart.gifContractedSubBlock.gif        for (int i = 0; i < 5; i ++ ) dot.gif{
 82InBlock.gif            philos[i] = new Philosopher(i, chopsticks[i], chopsticks[(i + 1% 5]);
 83ExpandedSubBlockEnd.gif        }

 84InBlock.gif        
 85ExpandedSubBlockStart.gifContractedSubBlock.gif        for (int i = 0; i < 5; i ++dot.gif{
 86InBlock.gif            philos[i].start();
 87ExpandedSubBlockEnd.gif        }

 88InBlock.gif        
 89InBlock.gif        try
 90ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 91InBlock.gif            System.in.read(); //wait until Enter is pressed
 92ExpandedSubBlockStart.gifContractedSubBlock.gif            for (int i = 0; i < 5; i ++dot.gif{
 93InBlock.gif            
 94InBlock.gif                philos[i].interrupt(); 
 95ExpandedSubBlockEnd.gif            }

 96ExpandedSubBlockEnd.gif        }

 97InBlock.gif        catch(Exception e)
 98ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ }
 99ExpandedSubBlockEnd.gif    }

100ExpandedBlockEnd.gif}

101 None.gif
102 None.gif        
103 None.gif                


运行结果:
哲学家 1 正在进餐
哲学家 3 正在进餐
哲学家等待另一根筷子
哲学家 3 正在思考
哲学家等待另一根筷子
哲学家 5 正在进餐
哲学家等待另一根筷子
哲学家 2 正在进餐
哲学家 1 正在思考
哲学家 5 正在思考
哲学家 2 正在思考
哲学家等待另一根筷子
...............

转载于:https://www.cnblogs.com/bankey/archive/2006/04/05/367442.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值