package tests; class Table { boolean forks[]; int eatctr; Table() { forks = new boolean[Philo.NUM_PHIL]; for (int i = 0; i < Philo.NUM_PHIL; ++i) forks[i] = true; } int getForks(int id) throws InterruptedException { synchronized (this){ int id1 = id; int id2 = (id + 1) % Philo.NUM_PHIL; // System.out.println(id + " check forks[" + id1 + "]=" + forks[id1] + " and forks[" + id2 + "]="+forks[id2]); // System.out.flush(); while(! (forks[id1] && forks[id2])) { // System.out.println(id + " wait for forks"); wait(); } forks[id1] = forks[id2] = false; // System.out.println(id + " got forks"); return eatctr++; } } synchronized void putForks(int id) { // System.out.println(id + " putforks"); forks[id] = forks[(id + 1) % Philo.NUM_PHIL] = true; notify(); // System.out.println(id + " notify done"); } } class Philo extends Thread { static final int NUM_PHIL = 4; static final int MAX_EAT = 2; int id; Table t; Philo(int id, Table t) { this.id = id; this.t = t; } public void run() { // System.out.println(id + " run start"); try { int max_eat = 0; while (max_eat < MAX_EAT) { // System.out.println(id + " let's try to get the forks"); // eat max_eat = t.getForks(id); // System.out.println(id + " have the forks now"); // eat //long l = (int)(Math.random() * 500) + 20; // System.gc(); //System.out.println(id + " eating (" + l + ")"); // eat //sleep(l); // System.out.println(id + " that was good"); // eat t.putForks(id); } } catch(InterruptedException e) { System.out.println(id + " run interrupted");; } } public static void main(String args[]) throws Exception { Table tab = new Table(); Philo[] p = new Philo[NUM_PHIL]; for (int i=0; i < NUM_PHIL; ++i) { p[i] = new Philo(i, tab); p[i].start(); } for (int i=0; i < NUM_PHIL; ++i) p[i].join(); // main should terminate last to have the access ctr correctly. } }