import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class DiningPhilosophers {

    public static void main(String[] args) {
        Lock[] forks = new ReentrantLock[5];
        for (int i = 0; i < 5; i++) {
            forks[i] = new ReentrantLock();
        }

        Philosopher[] philosophers = new Philosopher[5];
        for (int i = 0; i < 5; i++) {
            philosophers[i] = new Philosopher(i, forks[i], forks[(i + 1) % 5]);
        }

        for (Philosopher philosopher : philosophers) {
            philosopher.start();
        }
    }

    static class Philosopher extends Thread {
        private int id;
        private Lock leftFork;
        private Lock rightFork;

        public Philosopher(int id, Lock leftFork, Lock rightFork) {
            this.id = id;
            this.leftFork = leftFork;
            this.rightFork = rightFork;
        }

        public void run() {
            while (true) {
                think();
                pickUpLeftFork();
                pickUpRightFork();
                eat();
                putDownRightFork();
                putDownLeftFork();
            }
        }

        private void think() {
            System.out.println("Philosopher " + id + " is thinking");
            try {
                Thread.sleep((long) (Math.random() * 5000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        private void eat() {
            System.out.println("Philosopher " + id + " is eating");
            try {
                Thread.sleep((long) (Math.random() * 5000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        private void pickUpLeftFork() {
            leftFork.lock();
            System.out.println("Philosopher " + id + " picked up left fork");
        }

        private void pickUpRightFork() {
            rightFork.lock();
            System.out.println("Philosopher " + id + " picked up right fork");
        }

        private void putDownLeftFork() {
            leftFork.unlock();
            System.out.println("Philosopher " + id + " put down left fork");
        }

        private void putDownRightFork() {
            rightFork.unlock();
            System.out.println("Philosopher " + id + " put down right fork");
        }
    }
}
``

原文地址: https://www.cveoy.top/t/topic/frW3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录