美文网首页
五个哲学家吃饭问题

五个哲学家吃饭问题

作者: 就这些吗 | 来源:发表于2019-12-29 00:37 被阅读0次

问题描述:

一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭。上述问题会产生死锁的情况,当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷子时产生死锁现象。
试着用多线程的形式防止死锁的出现,让每一位哲学家都顺利吃上饭
(这是当初2019年秋招恒生电子的最后一道编程题,诶当初没答好,现在又复习到这个知识点,再来补一下吧,大家一定要自己动手写啊!!,当初确实是卡在了最后一名哲学家身边筷子编号的问题,一直很纠结,这里用了fork[i]||fork[(i+1)%5]来判断是否wait,确实是秒~~)

哲学家类:

public class Philosopher implements Runnable {

    private Fork fork;

    public Philosopher(Fork fork) {
        this.fork = fork;
    }

    @Override
    public void run() {
        try {
            System.out.println("哲学家" + Thread.currentThread().getName() + "进入思考");
            Thread.sleep(1000);
            System.out.println("哲学家" + Thread.currentThread().getName() + "思考完了,准备拿起筷子");
            fork.takeFork();
            System.out.println("哲学家" + Thread.currentThread().getName() + "拿起了筷子,恰饭咯");
            Thread.sleep(1000);
            fork.putFork();
            System.out.println("哲学家" + Thread.currentThread().getName() + "恰完了,放下了筷子");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Fork fork = new Fork();
        Philosopher p0 = new Philosopher(fork);
        Philosopher p1 = new Philosopher(fork);
        Philosopher p2 = new Philosopher(fork);
        Philosopher p3 = new Philosopher(fork);
        Philosopher p4 = new Philosopher(fork);
        new Thread(p0, "0").start();
        new Thread(p1, "1").start();
        new Thread(p2, "2").start();
        new Thread(p3, "3").start();
        new Thread(p4, "4").start();
    }

}

筷子类:

public class Fork {
    boolean fork[] = { false, false, false, false, false };

    public synchronized void takeFork() {
        String s = Thread.currentThread().getName();
        int i = Integer.parseInt(s);
        while (fork[i] || fork[(i + 1) % 5]) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        fork[i] = true;
        fork[(i + 1) % 5] = true;

    }

    public synchronized void putFork() {
        String s = Thread.currentThread().getName();
        int i = Integer.parseInt(s);
        fork[i] = false;
        fork[(i + 1) % 5] = false;
        notifyAll();

    }

}

相关文章

  • 五个哲学家吃饭问题

    问题描述: 一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只...

  • 吃饭问题

    关于孩子吃饭问题,我也赞同不好好吃就把饭撤走,等到下顿饭时再吃。但中间的水果点心还是按平常的量给。 对没吃过的饭菜...

  • 吃饭问题

    不知道别人家会不会也和我们家一样,常常都在为一日三餐吃什么伤脑筋。吃饭问题一直就是一件说起来简单,做起来麻烦的事情...

  • 吃饭问题

    关于吃饭问题,成了每天的选择题。 吃个饭,一家人好几个口味。 七十年代的,一顿馍馍一顿面就很享受,虽然也有厌倦的时...

  • 吃饭问题

    昨天重新分班,姑娘进到了新的班级。今天老师便在群里统计这学期需在校就餐的名单。不用说,小姑娘想报,可一想到上学期日...

  • 吃饭问题

    当初怀大宝的时候,我是很能吃的,总觉得肚子饿。 有一段时间特别喜欢吃蛋糕,有一段时间又特别喜欢吃刚出锅的馒头,结果...

  • 吃饭问题

    今天逛的店都是明码标价的。甜食已经不吸引我,除非我非常非常饿,或者是遇到国家级世界级省级有名的厨师或品牌才尝尝 。...

  • 吃饭问题

    周一上班,照例到食堂吃早饭,还没到门口,有同事迎面过来提醒:要戴口罩的,门口有人在检查。这个人没戴口罩,看来是被拒...

  • 吃饭问题

    今天想到吃饭这个话题,是看到朋友圈某位朋友发了一段有关做饭和吃饭的话题。谈到吃这个问题,确实是每个人都有可以...

  • 对于不好好吃饭的孩子,我能怎么办?

    2018年7月22日 星期天 天气:晴 -1- 孩子的吃饭问题已为常谈,每次说到孩子的吃饭问题,大多...

网友评论

      本文标题:五个哲学家吃饭问题

      本文链接:https://www.haomeiwen.com/subject/ipieoctx.html