Java算法完美解决五位哲学家用餐问题

五位哲学家用餐问题相信大家也知道,大概就是五位哲学家在圆形餐桌上吃饭,每两位哲学家之间有一根筷子,即每位哲学家左右两边都有一根筷子,接下来哲学家的步骤是:拿起左右筷子用餐   =》中间放下左右筷子思考 =》继续拿起左右筷子用餐 =》用餐完毕,涉及到并发处理及死锁的避免问题

话不多说,上代码:

package com.PTakeUpChopStick;

public class ChopStick {

    public boolean available = true;
    public int num;
    
    public ChopStick(int num) {
        // TODO Auto-generated constructor stub
        this.num = num;
    }
    
    public synchronized boolean takeup(int id) {
        if(available) {
//            System.out.println("哲学家" + id + "拿起" + "chop" + num + ":takeup");
            available = false;
            return true;
        }else {
            return false;
        }
    }
    
    public void putdown(int id) {
//        System.out.println("哲学家" + id + "放下" + "chop" + num + ":putdown");
        available = true;
    }
    
    
}
 

package com.PTakeUpChopStick;

public class Philosopher extends Thread{

    private int id;
    private ChopStick leftChop; 
    private ChopStick rightChop; 
    
    public Philosopher(int id, ChopStick leftChop, ChopStick rightChop) {
        // TODO Auto-generated constructor stub
        this.id = id;
        this.leftChop = leftChop;
        this.rightChop = rightChop;
    }
    
    public void think() {
        
            leftChop.putdown(id);
            rightChop.putdown(id);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
        
    @Override
    public void run() {
        // TODO Auto-generated method stub
        boolean bl=false;
        boolean br=false;
        while(!bl || !br) {
//            System.out.println(id+":left:" + leftChop.available);
//            System.out.println(id+":right:" + rightChop.available);
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
            bl = leftChop.takeup(id);
            br = rightChop.takeup(id);
            //解决拿起了一只筷子没有退出循环下次循环这只筷子没有被任何人占用却为false的问题
            if(bl ^ br) {    
                if(bl) {
                    leftChop.putdown(id);
                }
                if(br) {
                    rightChop.putdown(id);
                }
            }
        }
        
        try {
            System.out.println("哲学家" + id + ":用餐中。。。");
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("哲学家" + id + ":思考中。。。");
        think();
        
        bl=false;
        br=false;
        while(!bl || !br) {
//            System.out.println(id+":left:" + leftChop.available);
//            System.out.println(id+":right:" + rightChop.available);
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
            bl = leftChop.takeup(id);
            br = rightChop.takeup(id);
            if(bl ^ br) {
                if(bl) {
                    leftChop.putdown(id);
                }
                if(br) {
                    rightChop.putdown(id);
                }
            }
        }

        try {
            System.out.println("哲学家" + id + ":用餐中。。。");
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("哲学家" + id + ":用餐完毕");       //用餐完毕,放下筷子让别人吃
        leftChop.putdown(id);
        rightChop.putdown(id);

    }    
    
    
}
 

package com.PTakeUpChopStick;

public class PTakeUpChopStickTest {

    static ChopStick[] chopsticks = new ChopStick[5];
    static Philosopher[] philos = new Philosopher[5];
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i = 0;i < 5;++i) {
            
            chopsticks[i] = new ChopStick(i);
        }
        
        for(int i = 0;i < 5;++i) {
            
            philos[i] = new Philosopher(i, chopsticks[i], chopsticks[(i+1)%5]);
        }
        
        for(int i = 0;i < 5;++i) {
            
            philos[i].start();
        }
    }

}

下面是运行截图:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值