]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos3.java
Hago que ande bien.
[z.facultad/75.59/filosofos.git] / src / filosofos3.java
1
2 import java.util.Random;
3
4 class Palitos 
5 {
6         /* Infica si un palito esta ocupado */
7         private boolean[] palitos;
8         private int size;
9
10         Palitos (int n)
11         {
12                 size = n;
13                 palitos = new boolean[n];
14         }
15
16         public synchronized boolean obtenerPalitos (int caller, int izq, int der)
17         {
18                 /* Espero mientras algun palito este ocupado */
19                 while (palitos[izq] || palitos[der]) {
20                         try {
21                                 wait ();
22                         }
23                         catch (Exception e) {}
24                 }
25         
26                 String s = (new Integer (caller)).toString ();
27                 System.out.println ("Soy "+s+" y agarro mis palitos");
28                 palitos[der] = true;
29                 palitos[izq] = true;
30
31                 return true;
32         }
33
34         public int Size ()
35         {
36                 return size;
37         }
38
39         public synchronized boolean soltarPalitos (int caller, int izq, int der)
40         {
41                 String s = (new Integer (caller)).toString ();
42                 System.out.println ("Soy "+s+" y suelto mis palitos");
43                 palitos[izq] = false;
44                 palitos[der] = false;
45
46                 /* Despierto 1 thread que este esperando por este
47                  * palito
48                  */
49                 notify ();
50                 return true;
51         }
52 }
53
54 class Filosofo extends Thread
55 {
56         private String id;
57         private int iId;
58         private int comidas;
59         private int comidas_actuales;
60         private int izq;
61         private int der;
62         private Palitos palitos;
63         private Random r = new Random ();
64
65         Filosofo (int _id, int cant_comidas, int _izq, int _der, Palitos p)
66         {
67                 iId = _id;
68                 id = (new Integer (_id)).toString ();
69                 comidas = cant_comidas;
70                 comidas_actuales = 0;
71                 izq = _izq;
72                 der = _der;
73                 palitos = p;
74         }
75
76         public void run ()
77         {
78                 while (comidas_actuales < comidas) {
79                         if (comidas_actuales%100 == 0) {
80                                 System.out.println ("Comida " + (new Integer (comidas_actuales)).toString());
81                         }
82                         pensar ();
83                         comer ();
84                 }
85                 System.out.println ("Listo el pollo "+id);
86         }
87
88         public void comer ()
89         {
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 ());
93                 comidas_actuales++;
94                 n = 0;
95                 try {
96                         Thread.sleep (n*1000);
97                 } catch (Exception e) {}
98
99                 palitos.soltarPalitos (iId, izq, der);
100         }
101
102         public void pensar ()
103         {
104                 int n = r.nextInt (5) + r.nextInt (2);
105                 System.out.println ("Soy " + id + " y estoy pensando por " + (new Integer(n)).toString ());
106                 n = 0;
107                 try {
108                         Thread.sleep (n*1000);
109                 } catch (Exception e) {}
110                 finally {}
111         }
112 }
113
114 public class filosofos3
115 {
116         static public void main (String[] args)
117         {
118                 int n;
119                 int i;
120                 int cant;
121
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>");
125                         return;
126                 }
127                 n = Integer.parseInt (args[0]);
128                 if (n < 2) {
129                         System.out.println ("Debe haber por lo menos 2 chinos");
130                         return;
131                 }
132
133                 cant = Integer.parseInt (args[1]);
134
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);
138                         f.start ();
139                 }
140         }
141 }