]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos3.java
me copio de gaz
[z.facultad/75.59/filosofos.git] / src / filosofos3.java
1
2 import java.util.Random;
3
4 class Palitos 
5         //extends Monitor
6 {
7         /* Infica si un palito esta ocupado */
8         private boolean[] palitos;
9 //      private Variable[] cond_palitos;
10
11         Palitos (int n)
12         {
13                 palitos = new boolean[n];
14                 //cond_palitos = new ConditionVariable[n];
15         }
16
17         public synchronized boolean obtenerPalito (int i)
18         {
19                 /* Espero a que el palito "i" sea liberado */
20                 while (palitos[i]) {
21                         try {
22                                 wait () ; //cond_palitos[i]);
23                         }
24                         catch (Exception e) {}
25                         finally { }
26                 }
27         
28                 palitos[i] = true;
29
30                 return true;
31         }
32
33         public synchronized boolean soltarPalito (int i)
34         {
35                 palitos[i] = false;
36
37                 /* Despierto 1 thread que este esperando por este
38                  * palito
39                  */
40                 notify ();
41                 //cond_palitos[i]);
42                 return true;
43         }
44 }
45
46 class Filosofo extends Thread
47 {
48         private String id;
49         private int comidas;
50         private int comidas_actuales;
51         private int izq;
52         private int der;
53         private Palitos palitos;
54         private Random r = new Random ();
55
56         Filosofo (String _id, int cant_comidas, int _izq, int _der, Palitos p)
57         {
58                 id = _id;
59                 comidas = cant_comidas;
60                 comidas_actuales = 0;
61                 izq = _izq;
62                 der = _der;
63                 palitos = p;
64         }
65
66         public void run ()
67         {
68                 while (comidas_actuales < comidas) {
69                         pensar ();
70                         agarrarPaloIzquierdo ();
71                         agarrarPaloDerecho ();
72                         comer ();
73                 }
74                 System.out.println ("Listo el pollo "+id);
75         }
76
77         public void comer ()
78         {
79                 int n = r.nextInt (5) + r.nextInt (2);
80                 System.out.println ("Soy " + id + " y estoy comiendo por " + (new Integer(n)).toString ());
81                 comidas_actuales++;
82                 try {
83                         Thread.sleep (n*1000);
84                 } catch (Exception e) {}
85                 finally {}
86         }
87
88         public void pensar ()
89         {
90                 int n = r.nextInt (5) + r.nextInt (2);
91                 System.out.println ("Soy " + id + " y estoy pensando por " + (new Integer(n)).toString ());
92                 try {
93                         Thread.sleep (n*1000);
94                 } catch (Exception e) {}
95                 finally {}
96         }
97
98         public void agarrarPaloIzquierdo ()
99         {
100                 if (palitos.obtenerPalito (izq))
101                         System.out.println ("Soy " + id + " y estoy agarrando el palizo izquierdo.");
102                 else
103                         System.out.println ("IZQ-ERROR?? : Creo que no deberia llegar aca.");
104         }
105
106         public void agarrarPaloDerecho ()
107         {
108                 if (palitos.soltarPalito (der))
109                         System.out.println ("Soy " + id + " y estoy agarrando el palizo derecho.");
110                 else
111                         System.out.println ("DER-ERROR?? : Creo que no deberia llegar aca.");
112         }
113 }
114
115 public class filosofos3
116 {
117         static public void main (String[] args)
118         {
119                 int n;
120                 int i;
121                 int cant;
122
123                 if (args.length < 2) {
124                         /* Java parece no poner en args[0] el caller -.- .. Java Sucks :P */
125                         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>");
126                         return;
127                 }
128                 n = Integer.parseInt (args[0]);
129                 if (n < 2) {
130                         System.out.println ("Debe haber por lo menos 2 chinos");
131                         return;
132                 }
133
134                 cant = Integer.parseInt (args[1]);
135
136                 Palitos p = new Palitos (n);
137                 for (i=0; i<n; i++) {
138                         String s = (new Integer(i)).toString ();
139                         Filosofo f = new Filosofo (s, cant, i, (i+1)%n, p);
140                         f.start ();
141                 }
142         }
143 }