?? java15s.htm
字號:
<HTML>
<HEAD>
<TITLE>Java desde Cero</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0z">
</HEAD>
<BODY background=/iconos/1.gif TEXT=000000 LINK=FF0000 VLINK=A62A2A>
<H1>Capítulo XV - Solución al problema propuesto
<BR>
</H1>
<P>
En forma muy sencilla, modificando sólo la clase <FONT FACE="Arial">Personal</FONT>,
podemos solucionar el problema de que el jefe llegue antes que
un empleado:<BR>
<PRE>
<FONT SIZE=2>class Personal extends Thread {
................
<B> static int llegaron = 0;
</B> ................
public void run() {
System.out.println("("+nombre+" llega)");
if (esJefe) {
<B> while (llegaron < 4) {
System.out.println("(Esperando...)");
}
</B> saludo.saludoJefe();
}
else <B>{
synchronized(this) {
llegaron++;
}
</B> saludo.esperarJefe(nombre);
}
}
}<BR>
</FONT>
</PRE>
<P>
Preparamos una variable <FONT FACE="Arial">static</FONT> (de clase)
para contar todos los empleados que pasaron por aquí; la
incrementamos justo antes de ejecutar <FONT FACE="Arial">saludo.esperarJefe</FONT>
(sincronizando el thread en el incremento para que no pasen los
problemas que vimos en el capítulo).
<P>
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.
<P>
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.<BR>
<PRE>
<FONT SIZE=2>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);
}
}
}<BR>
<BR>
</FONT>
</PRE>
<P>
Jorge Bourdette
<P>
<A HREF="mailto:jpb@amarillas.com" >jpb@amarillas.com</A><BR>
</BODY>
</HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -