DESCARGAR
public class filosofos {
public static void main(String[] args) {
//generar filosofos
//filosofo = hilo de ejecucion
Mesa mesa = new Mesa();
for (int i = 0; i < 5; i++) {
new Thread(new Filosofo(i+1,mesa)).start();
}
}
}
public class Filosofo implements Runnable {
private int numFilosofo;
private Mesa mesa;
public Filosofo(int filo, Mesa table){
numFilosofo=filo;
mesa=table;
System.out.println("Filosofo "+numFilosofo+" creado.");
}
@Override
public void run() {
try{
while(true){
pensar();
comer();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void comer() throws InterruptedException {
System.out.println("Filosofo "+numFilosofo+" intentando comer.");
mesa.obtenTenedor(numFilosofo,(numFilosofo-1)%5);
mesa.obtenTenedor(numFilosofo, numFilosofo%5);
System.out.println("Filosofo "+numFilosofo+" comiendo.");
Thread.sleep(2000);
mesa.devolverTenedor(numFilosofo, numFilosofo%5);
mesa.devolverTenedor(numFilosofo, (numFilosofo-1)%5);
}
private void pensar() throws InterruptedException {
System.out.println("Filosofo "+numFilosofo+" pensando.");
Thread.sleep(2000);
}
}
public class Mesa {
 private boolean[] HayTenedor = new boolean[]{true, true, true, true, true};
 public int filosofosMesa = 0;
 public synchronized void obtenTenedor(int numFilosofo, int numTenedor) {
  while(!HayTenedor[numTenedor]){
   try {
    wait();//espera hasta que llegue el tenedor
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  while(HayTenedor[numTenedor]){
   System.out.println("Filosofo "+numFilosofo+" toma tenedor "+ numTenedor);
   HayTenedor[numTenedor]=false;
  }
 }
 public synchronized void devolverTenedor(int numFilosofo, int numTenedor) {
  System.out.println("Filosofo "+numFilosofo+" devuelve tenedor "+ numTenedor);
  HayTenedor[numTenedor]=true;
  notifyAll();//avisa de que ha devuelto el tenedor
 }
 public synchronized void pedirMesa(int numFilosofo){
  while(filosofosMesa==2){
   try {
    wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  System.out.println("Filosofo "+numFilosofo+" se pone en mesa.");
  filosofosMesa++;
 }
 public synchronized void devolverMesa(int numFilosofo){
  filosofosMesa--;
  System.out.println("Filosofo "+numFilosofo+" deja la mesa.");
//  if(filosofosMesa==1){
//   notifyAll();
//  }
 }
}