⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java15s.htm

📁 E-books about Java Programing in Spanish
💻 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&iacute;tulo XV - Soluci&oacute;n al problema propuesto

<BR>

</H1>

<P>

En forma muy sencilla, modificando s&oacute;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(&quot;(&quot;+nombre+&quot; llega)&quot;);

		if (esJefe) {

<B>			while (llegaron &lt; 4) {

				System.out.println(&quot;(Esperando...)&quot;);

			}

</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&iacute;; 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&iacute;tulo).

<P>

En el caso del jefe, simplemente espera que el contador llegue

a 4. Podr&iacute;amos modificar esto un poco, pasando la cantidad

de empleados como par&aacute;metro para que sea m&aacute;s flexible.

<P>

Inclusive, podemos usar dos constructores distintos (uno para

los empleados y otro para el jefe, y en este &uacute;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, &quot;JEFE&quot;, 3);

		Personal pablo = new Personal(hola, &quot;Pablo&quot;);

		Personal luis = new Personal(hola, &quot;Luis&quot;);

		Personal andrea = new Personal(hola, &quot;Andrea&quot;);

		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+&quot;&gt; Buenos dias jefe!&quot;);

	  }

	  catch (InterruptedException e) {

		System.out.println(e.toString());

		

	  }

	}



	synchronized void saludoJefe() {

		System.out.println(&quot;JEFE&gt; Buenos dias!&quot;);

		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(&quot;(&quot;+nombre+&quot; llega)&quot;);

		if (esJefe) {

			while (llegaron &lt; numEmp) { System.out.println(&quot;(Esperando...)&quot;); }

			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 + -