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 ());
95 Thread.sleep (n*1000);
96 } catch (Exception e) {}
98 palitos.soltarPalitos (iId, izq, der);
101 public void pensar ()
103 int n = r.nextInt (5) + r.nextInt (2);
104 System.out.println ("Soy " + id + " y estoy pensando por " + (new Integer(n)).toString ());
106 Thread.sleep (n*1000);
107 } catch (Exception e) {}
112 public class filosofos3
114 static public void main (String[] args)
120 if (args.length < 2) {
121 /* Java parece no poner en args[0] el caller -.- .. Java Sucks :P */
122 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>");
125 n = Integer.parseInt (args[0]);
127 System.out.println ("Debe haber por lo menos 2 chinos");
131 cant = Integer.parseInt (args[1]);
133 Palitos p = new Palitos (n);
134 for (i=0; i<n; i++) {
135 Filosofo f = new Filosofo (i, cant, i, (i+1)%n, p);