import java.lang.*; class Semaforo { int value; public Semaforo() { value = 1; } public Semaforo(int value) { this.value = value; } public synchronized void up() { value++; notify(); } public synchronized void down() { while (value<=0) { try { wait(); } catch(InterruptedException e) { }; } value--; } } class Dati{ char Stato[]; // array di stati Semaforo s[]; // array di semafori Semaforo mutex; public Dati() { Stato = new char[5]; s = new Semaforo[5]; for (int i=0;i<5;i++) s[i]= new Semaforo(); // crea semafori mutex = new Semaforo(); } } class Filosofo extends Thread { Dati dati; int i; public Filosofo(int i, Dati dati) {this.dati = dati;this.i = i; } public int Sx(int i) {return i; } // semaforo di sinistra public int Dx(int i) {if (i==4) return 1; else return (i+1); } // di destra public void Prendif(int i) { // Cerca di prendere una forchetta dati.mutex.down(); dati.Stato[i]='A'; Test(i); dati.mutex.up(); dati.s[i].down(); } public void Rilasciaf(int i) { dati.mutex.down();dati.Stato[i] = 'P'; Test(Sx(i)); Test(Dx(i)); dati.mutex.up(); } public void Test (int i) { // controlla se puo' prendere la forchetta if (dati.Stato[i]=='A' && dati.Stato[Dx(i)]!='M' && dati.Stato[Sx(i)]!='M') { dati.Stato[i]='M'; dati.s[i].up(); } } public void run() { while(true) { System.out.println("Filosofo "+i+" pensa"); Prendif(i); System.out.println("Filosofo "+i+" mangia"); Rilasciaf(i); } } } public class pcp14 { public static void main(String argv[]) { Dati dati = new Dati(); for(int i=0;i<5;i++) dati.Stato[i]='P';// inizializza stati filosofo Filosofo f1 = new Filosofo(0,dati); Filosofo f2 = new Filosofo(1,dati); Filosofo f3 = new Filosofo(2,dati); Filosofo f4 = new Filosofo(3,dati); Filosofo f5 = new Filosofo(4,dati); f1.start(); f2.start(); f3.start(); f4.start(); f5.start(); } }