2 import java.util.Random;
6 /* Infica si un palito esta ocupado */
7 private boolean[] palitos;
13 palitos = new boolean[n];
16 public synchronized boolean obtenerPalitos (int caller, int izq, int der)
18 /* Espero mientras algun palito este ocupado */
19 while (palitos[izq] || palitos[der]) {
23 catch (Exception e) {}
26 String s = (new Integer (caller)).toString ();
27 System.out.println ("Soy "+s+" y agarro mis palitos");
39 public synchronized boolean soltarPalitos (int caller, int izq, int der)
41 String s = (new Integer (caller)).toString ();
42 System.out.println ("Soy "+s+" y suelto mis palitos");
46 /* Despierto 1 thread que este esperando por este
54 class Filosofo extends Thread
59 private int comidas_actuales;
62 private Palitos palitos;
63 private Random r = new Random ();
65 Filosofo (int _id, int cant_comidas, int _izq, int _der, Palitos p)
68 id = (new Integer (_id)).toString ();
69 comidas = cant_comidas;
78 while (comidas_actuales < comidas) {
79 if (comidas_actuales%100 == 0) {
80 System.out.println ("Comida " + (new Integer (comidas_actuales)).toString());
85 System.out.println ("Listo el pollo "+id);
90 int n = r.nextInt (5) + r.nextInt (2);
91 palitos.obtenerPalitos (iId, izq, der);
92 System.out.println ("Soy " + id + " y estoy comiendo por " + (new Integer(n)).toString ());
96 Thread.sleep (n*1000);
97 } catch (Exception e) {}
99 palitos.soltarPalitos (iId, izq, der);
102 public void pensar ()
104 int n = r.nextInt (5) + r.nextInt (2);
105 System.out.println ("Soy " + id + " y estoy pensando por " + (new Integer(n)).toString ());
108 Thread.sleep (n*1000);
109 } catch (Exception e) {}
114 public class filosofos3
116 static public void main (String[] args)
122 if (args.length < 2) {
123 /* Java parece no poner en args[0] el caller -.- .. Java Sucks :P */
124 System.out.println ("Modo de uso: java filosofo3 <Cantidad de chinos invitados a la fiesta> <Cantidad de rondas que estara pensando o comiendo cada chino>");
127 n = Integer.parseInt (args[0]);
129 System.out.println ("Debe haber por lo menos 2 chinos");
133 cant = Integer.parseInt (args[1]);
135 Palitos p = new Palitos (n);
136 for (i=0; i<n; i++) {
137 Filosofo f = new Filosofo (i, cant, i, (i+1)%n, p);