常用搜索: 北大青鸟系统分析师数据库系统工程师网络工程师软件设计师软件评测师信息安全工程师程序员网络管理员短信猫OracleSQL ServerDB2AndroidWindows操作系统


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

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

  1/*
  2 * 创建日期 2006-4-5
  3 */

  4package threadDemo;
  5
  6class ChopStick {    //筷子类
  7    boolean available;
  8    ChopStick() {
  9        available=true;  //可以拿起
 10    }

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

 18        available=false;
 19    }

 20    
 21    public synchronized void putdown() {  //放下动作
 22        available=true;
 23        notify();
 24    }

 25}

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

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

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

 51    
 52    public void run() {
 53        while(true{
 54            eat();
 55            
 56            try {
 57                sleep(2000);  //吃的时间是2秒
 58            }

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

 66            catch (InterruptedException e) {}
 67        }

 68    }

 69}

 70
 71
 72public class Dining {      
 73    static ChopStick[] chopsticks = new ChopStick[5];  
 74    static Philosopher[] philos = new Philosopher[5];
 75    
 76    public static void main(String args[]) {
 77        for (int i = 0; i < 5; i ++ ) {
 78            chopsticks[i] = new ChopStick();
 79        }

 80        
 81        for (int i = 0; i < 5; i ++ ) {
 82            philos[i] = new Philosopher(i, chopsticks[i], chopsticks[(i + 1% 5]);
 83        }

 84        
 85        for (int i = 0; i < 5; i ++{
 86            philos[i].start();
 87        }

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

 96        }

 97        catch(Exception e)
 98        { }
 99    }

100}

101
102        
103                


运行结果:
哲学家 1 正在进餐
哲学家 3 正在进餐
哲学家等待另一根筷子
哲学家 3 正在思考
哲学家等待另一根筷子
哲学家 5 正在进餐
哲学家等待另一根筷子
哲学家 2 正在进餐
哲学家 1 正在思考
哲学家 5 正在思考
哲学家 2 正在思考
哲学家等待另一根筷子
...............
posted on 2006-04-05 13:40  Bankey  阅读(5859)  评论(5编辑  收藏  举报
常用插件:Html Agility PackjchardetThickBoxFCKeditoreWebEditorAjaxProAspNetPager