En forma muy sencilla, modificando sólo la clase Personal,
podemos solucionar el problema de que el jefe llegue antes que un empleado:
class Personal extends Thread { ................ static int llegaron = 0; ................ public void run() { System.out.println("("+nombre+" llega)"); if (esJefe) { while (llegaron < 4) { System.out.println("(Esperando...)"); } saludo.saludoJefe(); } else { synchronized(this) { llegaron++; } saludo.esperarJefe(nombre); } } }
Preparamos una variable static (de clase) para contar todos los empleados que pasaron por aquí; la incrementamos justo antes de ejecutar saludo.esperarJefe (sincronizando el thread en el incremento para que no pasen los problemas que vimos en el capítulo).
En el caso del jefe, simplemente espera que el contador llegue a 4. Podríamos modificar esto un poco, pasando la cantidad de empleados como parámetro para que sea más flexible.
Inclusive, podemos usar dos constructores distintos (uno para los empleados y otro para
el jefe, y en este último caso pasamos la cantidad de empleados a esperar). Les dejo el
ejemplo para que lo estudien.
public class Ejemplo23 { public static void main(String argv[]) { Saludo hola = new Saludo(); Personal jefe = new Personal(hola, "JEFE", 3); Personal pablo = new Personal(hola, "Pablo"); Personal luis = new Personal(hola, "Luis"); Personal andrea = new Personal(hola, "Andrea"); jefe.start(); pablo.start(); luis.start(); andrea.start(); try { pablo.join(); luis.join(); andrea.join(); jefe.join(); } catch (Exception e) { System.out.println(e); } } } class Saludo { synchronized void esperarJefe(String empleado) { try { wait(); System.out.println(empleado+"> Buenos dias jefe!"); } catch (InterruptedException e) { System.out.println(e.toString()); } } synchronized void saludoJefe() { System.out.println("JEFE> Buenos dias!"); notifyAll(); } } class Personal extends Thread { String nombre; Saludo saludo; boolean esJefe; static int llegaron = 0; int numEmp; Personal (Saludo s, String n) { esJefe = false; nombre = n; saludo = s; } Personal (Saludo s, String n, int x) { esJefe = true; nombre = n; saludo = s; numEmp = x; } public void run() { System.out.println("("+nombre+" llega)"); if (esJefe) { while (llegaron < numEmp) { System.out.println("(Esperando...)"); } saludo.saludoJefe(); } else { synchronized(this) { llegaron++; } saludo.esperarJefe(nombre); } } }