解决哲学家就餐问题之同时拿起两只筷子才允许吃饭

本文通过Java代码实现哲学家就餐问题,展示了如何使用同步和等待解决死锁问题,每个哲学家在思考和进餐间切换,确保同时只能拿起两只筷子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标红的地方便是算法的关键思想,理解了就相当简单了。不理解的可以根据注释理解一下。

1.同时拿起两只筷子才允许吃饭。

package tset;

class Philosopher extends Thread {
    
    int id;     
    private Chopsticsks chopsticsks; 

    public Philosopher(int num,Chopsticsks chopsticsks) {
        super();
        id=num;
        this.chopsticsks = chopsticsks;
    }

    public void run() {
        while (true) {
            thinking();        //思考吃什么
            chopsticsks.take();//拿起筷子
            eating();          //吃
            chopsticsks.put(); //放下筷子
        }
    }

    private void thinking() {
        System.out.println("哲学家 " + id + ": 开始思考!");
        try {
            sleep(1000);  //思考时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void eating() {
        System.out.println("哲学家" + id + " : 开始食用!");
        try {
            sleep(1000);   //吃东西会花时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Chopsticsks {
    private boolean[] used = { false, false, false, false, false };        //初始化筷子为未使用

    public synchronized void take() {
        Philosopher p = (Philosopher) Thread.currentThread();
        int id = p.id;
        
        //两只筷子有一个已使用,则处于等待状态
        while (used[id] || used[(id + 1) % 5]) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("哲学家" + id + "拿起两只筷子:"+id+"、"+(id + 1) % 5);
        used[id] = true;              //将筷子设为已使用
        used[(id + 1) % 5] = true;
    }

    @SuppressWarnings("deprecation")
    public synchronized void put() {
        Philosopher p = (Philosopher) Thread.currentThread();
        int id = p.id;
        System.out.println("哲学家" + id + "放下手中的筷子:"+id+"、" +(id + 1) % 5);
        used[id] = false;          //将筷子设为未使用
        used[(id + 1) % 5] = false;
        notifyAll();               //唤醒所有等待队列中的进程

    }
}

public class Second {
    public static void main(String[] args) {
        Chopsticsks chopsticsks = new Chopsticsks();

        new Philosopher(0,chopsticsks).start();
        new Philosopher(1,chopsticsks).start();
        new Philosopher(2,chopsticsks).start();
        new Philosopher(3,chopsticsks).start();
        new Philosopher(4,chopsticsks).start();
    }
}
结果截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值