Обедать Философов в Яве, чтобы избежать тупика

У меня возникают проблемы с правильной работой кода Diners Philosophers. Может ли кто-нибудь помочь мне сделать эту работу? Это школьное задание, в котором мы должны попытаться реализовать " Обеденную философию" без тупика. И объясните, как мы этого избежали.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Dining {

    public static void main(String[] args) throws InterruptedException {

        ExecutorService es = null;

        Philosopher[] philosophers = new Philosopher[5];
        Chopstick[] chopsticks = new Chopstick[5];

        for (int i = 0; i < 5; i++) {
            chopsticks[i] = new Chopstick(i);
        }

        es = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 5; i++) {
            if (i != 4) {
                philosophers[i] = new Philosopher(i, chopsticks[i], chopsticks[(i + 1) % 5]);
            } else {
                philosophers[i] = new Philosopher(i, chopsticks[(i + 1) % 5], chopsticks[i]);
            }
            es.execute(philosophers[i]);
        }
    }

    public static class Chopstick {

        private int number;
        private boolean inUse;

        public Chopstick(int number) {
            this.number = number;
            inUse = false;
        }

        public synchronized void take(int s) throws InterruptedException {
            //if (inUse) {
                // System.out.println("---");
                //wait();
            //}
            this.inUse = true;
            System.out.println(s + " take left chopstick " + number);

        }

        public synchronized void release(int s) {
            System.out.println(s + " released chopstick " + number);
            this.inUse = false;
            notifyAll();
            // notifyall
        }

    }

    public static class Philosopher implements Runnable {

        private int id;
        private Chopstick leftC;
        private Chopstick rightC;
        // private Object lock = new Object();

        public Philosopher(int id, Chopstick leftC, Chopstick rightC) {
            this.id = id;
            this.leftC = leftC;
            this.rightC = rightC;
        }

        @Override
        public void run() {
            int i = 0;
            // synchronized (lock) {
            try {
                while(i != 1000) {
                    Thread.sleep((int) (Math.random() * 1000));
                    leftC.take(id);
                    rightC.take(id);
                    eat();
                    rightC.release(id);
                    leftC.release(id);
                    // }
                    think();
                    i++;
                    System.out.println(i);
                }
            } catch (Exception e) {

            }

        }

        public void think() {
            System.out.println(id + " is thinking");
            // Thread.sleep(rng.nextInt(1000));
        }

        public void eat() {

            System.out.println(id + " eats");
            // Thread.sleep(rng.nextInt(1000));

        }
    }
}

Я могу заставить его работать, но кажется, что он не работает правильно.

0 ответов

Другие вопросы по тегам