]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos3.java
Fix doc3
[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                 try {
95                         Thread.sleep (n*1000);
96                 } catch (Exception e) {}
97
98                 palitos.soltarPalitos (iId, izq, der);
99         }
100
101         public void pensar ()
102         {
103                 int n = r.nextInt (5) + r.nextInt (2);
104                 System.out.println ("Soy " + id + " y estoy pensando por " + (new Integer(n)).toString ());
105                 try {
106                         Thread.sleep (n*1000);
107                 } catch (Exception e) {}
108                 finally {}
109         }
110 }
111
112 public class filosofos3
113 {
114         static public void main (String[] args)
115         {
116                 int n;
117                 int i;
118                 int cant;
119
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>");
123                         return;
124                 }
125                 n = Integer.parseInt (args[0]);
126                 if (n < 2) {
127                         System.out.println ("Debe haber por lo menos 2 chinos");
128                         return;
129                 }
130
131                 cant = Integer.parseInt (args[1]);
132
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);
136                         f.start ();
137                 }
138         }
139 }