class DiningMonitor implements Resource {
int n = 0;
int state[] = null;
static final int thinking = 0, hungry = 1, eating = 2;
public DiningMonitor(int initN) {
n = initN;
state = new int[n];
for (int i = 0; i < n; i++) state[i] = thinking;
}
int left(int i) {
return (n + i - 1) % n;
}
int right(int i) {
return (i + 1) % n;
}
public synchronized void acquire(int i) {
state[i] = hungry;
test(i);
while (state[i] != eating)
Util.myWait(this);
}
public synchronized void release(int i) {
state[i] = thinking;
test(left(i));
test(right(i));
}
void test(int i) {
if ((state[left(i)] != eating) &&
(state[i] == hungry) &&
(state[right(i)] != eating)) {
state[i] = eating;
notifyAll();
}
}
public static void main(String[] args) {
DiningMonitor dm = new DiningMonitor(5);
for (int i = 0; i < 5; i++)
new Philosopher(i, dm);
}
}