/* ForkControl.java - monitor to keep control of the forks in the Dining Philosophers' problem. Written by Robert Sheehan. 01/09/97 */ public class ForkControl { private boolean[] forkAvailable; public ForkControl() { forkAvailable = new boolean[DiningPhilosophers.NUMBER]; for (int i = 0; i < DiningPhilosophers.NUMBER; i++) forkAvailable[i] = true; } public synchronized void getBothForks(int name) throws InterruptedException { while (!forkAvailable[name]) wait(); forkAvailable[name] = false; while (!forkAvailable[(name + 1) % DiningPhilosophers.NUMBER]) wait(); forkAvailable[name] = false; } public synchronized void putBackBothForks(int name) { forkAvailable[name] = true; forkAvailable[(name + 1) % DiningPhilosophers.NUMBER] = true; notifyAll(); // try it with notify() } }