/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author felix
 */
public class prueba1 {
    Tenedor tenedores[];
    Filosofo filosofos[];
    
    public prueba1() {
        int i, k;
        tenedores = new Tenedor[5];
        filosofos = new Filosofo[5];
        
        for(i=0; i<5; i++)
            tenedores[i] = new Tenedor();
            
        for(i=0; i<5; i++){
            k = i-1 <0 ? 4 : i-1;
            filosofos[i] = new Filosofo(tenedores[k], tenedores[i], i);
        }
        
        for(i=0; i<5; i++)
            filosofos[i].start(); 
    }
    
    public static void main(String[] args) {
        new prueba1();
    }

    class Tenedor {
       private boolean disponible = true;
       
       public synchronized void get() {
          while (disponible == false) {
             try {
                wait();
             }
             catch (InterruptedException e) {
             }
          }
          disponible = false;
          notifyAll();
       }  
       
       public synchronized void put() {
          while (disponible == true) {
             try {
                wait();
             }
             catch (InterruptedException e) { 
             } 
          }
          disponible = true;
          notifyAll();
       }
    }

    class Filosofo extends Thread {
       private Tenedor tenedorIzquierdo, tenedorDerecho;
       private int numero;
       
       public Filosofo(Tenedor unTenedorIzquierdo, Tenedor unTenedorDerecho, 
               int unNnumero) {
          tenedorIzquierdo = unTenedorIzquierdo;
          tenedorDerecho = unTenedorDerecho;
          this.numero = unNnumero;
       }
       
       @Override
       public void run() {
             for (int i = 0; i < 10; i++) {
                tenedorIzquierdo.get();
                tenedorDerecho.get();
                System.out.println("Filosofo #" 
                            + this.numero
                            + " Come " + i);
                try {
                sleep((int)(Math.random() * 100));
                } catch (InterruptedException e) { }
                
                tenedorIzquierdo.put();
                tenedorDerecho.put();
                System.out.println("Filosofo #" + this.numero
                + " piensa " + i );
                try {
                sleep((int)(Math.random() * 100));
                } catch (InterruptedException e) { }
                
             }
       }
    }
}
