]> git.llucax.com Git - z.facultad/75.59/filosofos.git/commitdiff
Primer version con monitores.
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Tue, 29 Nov 2005 02:19:54 +0000 (02:19 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Tue, 29 Nov 2005 02:19:54 +0000 (02:19 +0000)
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 [new file with mode: 0644]

diff --git a/src/filosofos3.java b/src/filosofos3.java
new file mode 100644 (file)
index 0000000..33d8fd1
--- /dev/null
@@ -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<n; i++) {
+                       String s = (new Integer(i)).toString ();
+                       Filosofo f = new Filosofo (s, n, i, (i+1)%n, p);
+                       f.start ();
+               }
+       }
+}