From 463f5a807c033f58fe695db6c650bc006f2243d7 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Tue, 29 Nov 2005 02:19:54 +0000 Subject: [PATCH] Primer version con monitores. Implementado en Java por simplicidad en el uso de monitores. Segun entiendo Object tiene el soporte de Monitores "simple" en Object (implementa wait, notify y notifyAll). Hay una clase Monitor (no pude encontrar en que paquete) que soporta Conditions y quedaria mas pulenta, pero para empezar creo que seria esto nomas. La ventaja de utilizar Conditions, es que el Wait se hace sobre el condition y cuando se libera un palito se despierta solo al thread que lo esta esperando siendo "mas eficiente". Si logro completar el ejemplo mas pulenta lo subo. --- src/filosofos3.java | 129 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/filosofos3.java diff --git a/src/filosofos3.java b/src/filosofos3.java new file mode 100644 index 0000000..33d8fd1 --- /dev/null +++ b/src/filosofos3.java @@ -0,0 +1,129 @@ + +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