Обедать Философов в Яве, чтобы избежать тупика
У меня возникают проблемы с правильной работой кода 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));
}
}
}
Я могу заставить его работать, но кажется, что он не работает правильно.