+
+import java.util.Random;
+
+class Palitos
+ //extends Monitor
+{
+ /* Infica si un palito esta ocupado */
+ private boolean[] palitos;
+// private Variable[] cond_palitos;
+
+ Palitos (int n)
+ {
+ palitos = new boolean[n];
+ //cond_palitos = new ConditionVariable[n];
+ }
+
+ public synchronized boolean obtenerPalito (int i)
+ {
+ /* Espero a que el palito "i" sea liberado */
+ while (palitos[i]) {
+ try {
+ wait () ; //cond_palitos[i]);
+ }
+ catch (Exception e) {}
+ finally { }
+ }
+
+ palitos[i] = true;
+
+ return true;
+ }
+
+ public synchronized boolean soltarPalito (int i)
+ {
+ palitos[i] = false;
+
+ /* Despierto 1 thread que este esperando por este
+ * palito
+ */
+ notify ();
+ //cond_palitos[i]);
+ return true;
+ }
+}
+
+class Filosofo extends Thread
+{
+ private String id;
+ private int comidas;
+ private int comidas_actuales;
+ private int izq;
+ private int der;
+ private Palitos palitos;
+ private Random r = new Random ();
+
+ Filosofo (String _id, int cant_comidas, int _izq, int _der, Palitos p)
+ {
+ id = _id;
+ comidas = cant_comidas;
+ comidas_actuales = 0;
+ izq = _izq;
+ der = _der;
+ palitos = p;
+ }
+
+ public void run ()
+ {
+ while (comidas_actuales < comidas) {
+ pensar ();
+ agarrarPaloIzquierdo ();
+ agarrarPaloDerecho ();
+ comer ();
+ }
+ System.out.println ("Listo el pollo "+id);
+ }
+
+ public void comer ()
+ {
+ int n = r.nextInt (5) + r.nextInt (2);
+ System.out.println ("Soy " + id + " y estoy comiendo por " + (new Integer(n)).toString ());
+ comidas_actuales++;
+ try {
+ Thread.sleep (n);
+ } catch (Exception e) {}
+ finally {}
+ }
+
+ public void pensar ()
+ {
+ int n = r.nextInt (5) + r.nextInt (2);
+ System.out.println ("Soy " + id + " y estoy pensando por " + (new Integer(n)).toString ());
+ try {
+ Thread.sleep (n);
+ } catch (Exception e) {}
+ finally {}
+ }
+
+ public void agarrarPaloIzquierdo ()
+ {
+ if (palitos.obtenerPalito (izq))
+ System.out.println ("Soy " + id + " y estoy agarrando el palizo izquierdo.");
+ else
+ System.out.println ("IZQ-ERROR?? : Creo que no deberia llegar aca.");
+ }
+
+ public void agarrarPaloDerecho ()
+ {
+ if (palitos.soltarPalito (der))
+ System.out.println ("Soy " + id + " y estoy agarrando el palizo derecho.");
+ else
+ System.out.println ("DER-ERROR?? : Creo que no deberia llegar aca.");
+ }
+}
+
+public class filosofos3
+{
+ static public void main (String[] args)
+ {
+ int n = 5;
+ int i;
+
+ Palitos p = new Palitos (n);
+ for (i=0; i<n; i++) {
+ String s = (new Integer(i)).toString ();
+ Filosofo f = new Filosofo (s, n, i, (i+1)%n, p);
+ f.start ();
+ }
+ }
+}