美文网首页
哲学家进餐问题

哲学家进餐问题

作者: 小丸子的呆地 | 来源:发表于2021-09-12 19:27 被阅读0次

哲学家进餐问题是著名的死锁问题,5个哲学家,5根筷子,每个哲学家进餐需要获得左右两根筷子才可以;

信号量

使用信号量完美解决,因为只有5根筷子,所以永远最多只能有两个不相邻的哲学家同时进餐;
选定0号和2号哲学家先开始进餐,每人进餐完毕唤醒下一个人;

// 筷子类
public class Kuaizi {
    long id;

    public Kuaizi(long id) {
        this.id = id;
    }
}

// 哲学家类
public class Zhexuejia implements Runnable {
    long id;
    Kuaizi left, right;
    Semaphore semaphore;
    Semaphore next;

    public Zhexuejia(long id, Kuaizi left, Kuaizi right, Semaphore semaphore, Semaphore next) {
        this.id = id;
        this.left = left;
        this.right = right;
        this.semaphore = semaphore;
        this.next = next;
    }

    public void eat() throws InterruptedException {
        synchronized (left) {
            System.out.println("哲学家" + id + "号拿起左手筷子" + left.id);
            TimeUnit.SECONDS.sleep(1);
            synchronized (right) {
                System.out.println("哲学家" + id + "号拿起右手筷子" + right.id);
                TimeUnit.SECONDS.sleep(1);
                System.out.println("哲学家" + id + "号吃饭");
                TimeUnit.SECONDS.sleep(1);

            }
            System.out.println("哲学家" + id + "号放下右手筷子" + right.id);
        }
        System.out.println("哲学家" + id + "号放下左筷子" + left.id);
    }

    @Override
    public void run() {
        for (; ; ) {
            try {
                semaphore.acquire();
                eat();
                next.release(1);
            } catch (InterruptedException e) {
            }
        }
    }
}

// 运行类
public class Test {

    public static void main(String[] args) {
        Kuaizi k0 = new Kuaizi(0);
        Kuaizi k1 = new Kuaizi(1);
        Kuaizi k2 = new Kuaizi(2);
        Kuaizi k3 = new Kuaizi(3);
        Kuaizi k4 = new Kuaizi(4);

        Semaphore s0 = new Semaphore(1);
        Semaphore s1 = new Semaphore(0);
        Semaphore s2 = new Semaphore(1);
        Semaphore s3 = new Semaphore(0);
        Semaphore s4 = new Semaphore(0);

        Zhexuejia z0 = new Zhexuejia(0, k0, k4, s0, s1);
        Zhexuejia z1 = new Zhexuejia(1, k1, k0, s1, s2);
        Zhexuejia z2 = new Zhexuejia(2, k2, k1, s2, s3);
        Zhexuejia z3 = new Zhexuejia(3, k3, k2, s3, s4);
        Zhexuejia z4 = new Zhexuejia(4, k4, k3, s4, s0);

        ExecutorService executorService = Executors.newFixedThreadPool(5);
        executorService.execute(z0);
        executorService.execute(z1);
        executorService.execute(z2);
        executorService.execute(z3);
        executorService.execute(z4);

        LockSupport.park();

    }
}

运行结果


image.png

混进一半的左撇子

相关文章

  • 哲学家进餐问题

    1965年,荷兰计算机科学家图灵奖得主Edsger Wybe Dijkstra提出并解决了一个他称之为哲学家进餐的...

  • 哲学家进餐问题

    问题描述 一张圆桌旁坐了五个哲学家,每两名哲学家中间有一根筷子,每个哲学家面前有一碗米饭。哲学家重复的做思考和进餐...

  • 哲学家进餐问题

    哲学家进餐问题是著名的死锁问题,5个哲学家,5根筷子,每个哲学家进餐需要获得左右两根筷子才可以; 信号量 使用信号...

  • 经典PIC问题

    哲学家进餐: 哲学家问题可出现拿起左边的筷子,然后拿起右边的筷子进餐,但是假如五个哲学家同时拿起左边的筷子,那么右...

  • 哲学家进餐

    哲学家进餐 VC++相关演示,本源码演示了线程同步算法的哲学家进餐问题,说明:本程序是操作系统中比较典型的线程同步...

  • windows下 c 实现哲学家进餐问题

  • 【专项专攻】01-哲学家进餐问题

    前言: 当一位哲学家思考时,他与其他同事不交流。时而,他会感到饥饿,并试图拿起与他相近的两根筷子(筷子在他和他的左...

  • Java 死锁分类

    1. 死锁简介 经典的“哲学家进餐”问题很好的描述了死锁的情况。5个哲学家吃中餐,坐在一张圆桌上,有5根筷子,每个...

  • 线程同步导致的问题死锁哲学家进餐问题

    请关注我的微信公众号 个人微信公众号 技术交流群 (仅作技术交流):642646237 ​请关注我的头条号: 线程...

  • 8.2 经典进程同步问题-哲学家进餐问题

    问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生精力用...

网友评论

      本文标题:哲学家进餐问题

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