11.05.2013 Views

Java Threads (Hilos en Java) - Universidad de Salamanca

Java Threads (Hilos en Java) - Universidad de Salamanca

Java Threads (Hilos en Java) - Universidad de Salamanca

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Java</strong> <strong>Threads</strong> (<strong>Hilos</strong> <strong>en</strong> <strong>Java</strong>)<br />

//No se hace nada. El usuario ha<br />

solicitado que paremos cambiando la<br />

imag<strong>en</strong>.<br />

} else {<br />

//Comi<strong>en</strong>za la animación!<br />

if (animatorThread == null) {<br />

animatorThread = new<br />

Thread(this);<br />

}<br />

animatorThread.start();<br />

}<br />

}<br />

public void stop() {<br />

animatorThread = null; }<br />

El hecho <strong>de</strong> especificar this <strong>en</strong> la s<strong>en</strong>t<strong>en</strong>cia new Thread(this) indica que el applet<br />

proporciona el cuerpo <strong>de</strong>l hilo. Esto se consigue implem<strong>en</strong>tado la interfaz <strong>Java</strong>.lang<br />

Runnable, la cual requiere que el applet proporcione un método run que conforme el cuerpo<br />

<strong>de</strong>l hilo. Trataremos sobre el método run <strong>de</strong>l applet AnimatorApplet un poco más tar<strong>de</strong>.<br />

Obsérvese como <strong>en</strong> ningún mom<strong>en</strong>to, <strong>en</strong> la clase AnimatorApplet se invoca al método<br />

stop <strong>de</strong> Thread. Esto es porque llamar al método Thread stop sería como darle porrazos<br />

<strong>en</strong> la cabeza al hilo. Es una forma drástica <strong>de</strong> conseguir que el hilo <strong>de</strong>t<strong>en</strong>ga lo que está<br />

haci<strong>en</strong>do. En lugar <strong>de</strong> esto, pue<strong>de</strong>s escribir el método run <strong>de</strong>l hilo <strong>de</strong> tal modo que el hilo<br />

finalizará <strong>de</strong> forma gratificante cuando le <strong>de</strong>s un golpecito <strong>en</strong> el hombre. Dicho golpecito <strong>en</strong> el<br />

hombro vi<strong>en</strong>e a ser la puesta a null <strong>de</strong> una instancia <strong>de</strong> una variable <strong>de</strong> tipo Thread.<br />

En AnimatorApplet, esta instancia <strong>de</strong> variable se d<strong>en</strong>omina animatorThread. El<br />

método start la establece como refer<strong>en</strong>cia al nuevo objeto Thread creado. Cuando el<br />

applet necesita matar el hilo, asigna a animatorThread el valor null. Esto finaliza el hilo,<br />

no convirtiéndolo <strong>en</strong> basura que pueda recogerse (no pue<strong>de</strong> ser recogido como basura mi<strong>en</strong>tras<br />

sea ejecutable), sino porque <strong>en</strong> la s<strong>en</strong>t<strong>en</strong>cia <strong>de</strong>l bucle, el hilo comprueba el valor <strong>de</strong> la variable<br />

animatorThread, continuando o finalizando <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> su valor. Este es el código<br />

relevante:<br />

public void run() {<br />

. . .<br />

while (Thread.curr<strong>en</strong>tThread() ==<br />

animatorThread) {<br />

...//Pres<strong>en</strong>ta un marco <strong>de</strong> animación y luego duerme.<br />

}<br />

}<br />

Si animatorThread apunta al mismo hilo que el hilo que está actualm<strong>en</strong>te <strong>en</strong><br />

ejecución, el hilo continua ejecutándose. Si, por otro lado, animatorThread es null, el hilo<br />

finaliza. Si animatorThread hace refer<strong>en</strong>cia a otro hilo, <strong>en</strong>tonces estaremos ante una<br />

extraña situación (algo extraño habrá ocurrido): start ha sido invocado tan pronto <strong>de</strong>spués <strong>de</strong><br />

28

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!