哲学家吃饭问题(关于死锁的问题)

一.定义

死锁:互斥条件,不可占有条件,占有且等待条件,循环等待。
哲学家吃饭问题:一个圆桌上有n个哲学家,每个哲学家左右各有一只筷子,面前有一碗面,当拿到一双筷子时才能得吃,否则只能思考。
当每个哲学家都先拿左边的筷子(或者先拿右边的筷子),此时每个人只有一只筷子,都进行思考,即死锁,我们要避免死锁。

二.代码

1.我们首先要定义一个哲学家类,因为是线程问题所以要继承Thread。哲学家类中包含哲学家的名字,左右筷子。

public class Philosopher extends Thread{
    public String name;//哲学家名字
    public ChopSticks left;//左边的筷子
    public ChopSticks right;//右边的筷子

2.同时我们要定义一个筷子类,其中包含筷子的名字以及筷子方法。

class ChopSticks extends ReentrantLock{
    public String name;//筷子的名字
    public ChopSticks(String name){
        this.name=name;
    }
}

注意:哲学家类和筷子类是独立的。

3.接着我们回到哲学家类,其中要定义两个方法分别是吃和思考。

public void eat(){
    if(left.tryLock()){
        try{
            if(right.tryLock()){
                try{
                    System.out.println(name+"eat...");
                }finally {
                    right.unlock();
                }
            }
        }finally {
            left.unlock();
        }
    }
}

思考

public void think(){
    System.out.println(name+"think...");
}

4.最后我们用run()方法调用吃和思考方法 线程启动。

public void run(){
    while(true){
        think();
        eat();
    }
}

5.主函数

public static void main(String[] args){

    ChopSticks c1=new ChopSticks("1");
    ChopSticks c2=new ChopSticks("2");
    ChopSticks c3=new ChopSticks("3");
    ChopSticks c4=new ChopSticks("4");
    ChopSticks c5=new ChopSticks("5");

    new Philosopher("A",c1,c2).start();
    new Philosopher("B",c2,c3).start();
    new Philosopher("C",c3,c4).start();
    new Philosopher("D",c4,c5).start();
    new Philosopher("E",c5,c1).start();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值