Threads de Control

Este applet muestra la hora actual y la actualiza cada segundo. Puedes moverte por la p�gina o realizar cualquier otra tarea mientras el reloj continua actualizandose porque el c�digo que actualiza el reloj y lo muestra se ejecuta dentro de un thread.

Esta secci�n explica el c�digo fuente de este applet.

En particular, esta p�gina descrbie los segmentos de c�digo que implementa el comportamiento del thread del reloj; no describe el c�digo que est� relacionado con el ciclo de vida del applet. Si no has escrito sus propios applets o si no est�s familiarizado con el ciclo de vida de una applet, podr�as encontrar las respuestas en El ciclo de vida de un Applet antes de proceder con esta p�gina.

.�Decidir Utilizar el Interface Runnable

El applet del reloj utiliza el interface Runnable para proporcionar el m�todo run() para su thread. Para ejecutarse dentro de un navegador compatible con Java, la clase Clock debe derivar de la clase Applet. Sin embargo este applet tambi�n necesita un thread para poder actualizar continuamente la pantalla sin tomar posesi�n del proceso en el que se est� ejecutando.

(Algunos navegadores, pero no todos, crean un nuevo thread para cada applet para impedir que un applet descort�s tome posesi�n del thread principal del navegador. Sin embargo, no deber�as contar con esto cuando escribas tus applets; los applets deben crear sus propios threads cuando hagan un trabajo de calculo intensivo). Como el lenguaje Java no soporta la herencia m�ltiple, la clase Class no puede heredarse desde la clase Thread y de la clase Applet a la vez.

Por eso, la clase Clock debe utilizar el interface Runnable para proporcionar el comportamiento de sus thread.

Los applets no son threads, ni ning�n navegador existente -- compatibles con Java o visualizadoes de applets crean threads autom�ticante en el que ejecutar applets. Por lo tanto, si un applet, necesita un thread debe cre�rselo el mismo. El applet del reloj necesita un thread en el que realizar las actualizaciones de pantalla porque se actualiza de forma frecuente y el usuario necesita poder realizar otras tareas a la vez que se ejecuta el reloj (como ir a otra p�gina o moverse por �sta).

.�El Interface Runnable

El applet del reloj proporciona un m�todo run() para su thread mediante el interface Runnable. La definici�n de la lcase Clock indica que es una subclase de la clase Applet y que implementa el interface Runnable. Si no est�s familiarizado con los interfaces puedes revisar la informaci�n de la lecci�n "Objetos, Clases, e Interfaces"

class Clock extends Applet implements Runnable {

El interface Runnable define un s�lo m�todo llamado run() que no acepta ning�n argumento y que no devuelve ning�n valor. Como la clase Clock implementa el interface Runnable, debe proporcionar una implementaci�n para el m�todo run() como est� definido en el interface. Sin embargo, antes de explicar el m�todo run() de la clase Clock, echemos un vistazo a los otros elementos del c�digo de esta clase.

.�Crear el Thread

La aplicaci�n en la que se ejecuta el applet llama al m�todo start() del applet cuando el usuario visita la p�gina del applet. El applet del reloj crea un Thread, clockThread, en su m�todo start() y arranca el thread.

public void start() {
    if (clockThread == null) {
        clockThread = new Thread(this, "Clock");
        clockThread.start();
    }
}

Primero el m�todo start() comprueba si clockThread es nulo. Si lo es, significa que el applet acaba de ser cargado o que ha sido parado anteriormente y se debe crear un nuevo Thread.

De otro modo, significa que el applet ya se est� ejecutando. El applet crea un nuevo Thread con esta llamada.

clockThread = new Thread(this, "Clock");

Observa que this -- el applet Clock -- es el primer argumento del constructor del thread.

El primer argumento de este constructor Thread debe implementar el interface Runnable y se convierte en el origen del thread. Cuando se construye de esta forma, el thread del reloj obtiene su m�todo run() desde el objeto Runnable origen -- en este caso el applet Clock.

El segundo argumento es s�lo el nombre del thread.

.�Parar el Thread

Cuando abandones la p�gina que muestra el Reloj, la aplicaci�n en la que el applet se est� ejecutando llama al m�todo stop() del applet. El m�todo stop() del applet Clock pone clockThread a nulo. Esto le dice al bucle principal en el m�todo run() que termine (observa la siguiente secci�n), la actualizaci�n del reloj resultando eventualmente en la parada del thread y la recolecci�n de basura.

public void stop() {
    clockThread = null;
}

Podr�as utilizar clockThread.stop() en su lugar, lo que parar�a inmediatamente el thread del reloj. Sin embargo, el m�todo stop() de la clase Thread tiene un efecto s�bito, lo que significa que el m�todo run() podr�a estar en medio de una operaci�n cr�tica cuando se pare el thread. Para los m�todos run() m�s complejos, utilizar el m�todo stop() de la clase Thread podr�a dejar el programa en un estado incosistente. Por esta raz�n, es mejor evitar el uso del m�todo stop() de la clase Thread cuando sea posible.

Si revisita la p�gina de nuevo, se llama otra vez al m�todo start() y el reloj arranca de nuevo con un nuevo thread.

.�El M�todo Run

Y finalmente, el m�todo run() del applet Clock implementa el coraz�n de este applet y se parace a esto.

public void run() {
        // El bucle termina cuando clockThread se pone a null en stop()
    while (Thread.currentThread() == clockThread) {
        repaint();
        try {
            clockThread.sleep(1000);
        } catch (InterruptedException e){
        }
    }
}

Como se vi� en la secci�n anterior, cuando se le pide al applet que se pare, este selecciona clockThread a null; esto permite que el m�todo run() sepa cuando debe parar.

As�, la primera l�nea del m�todo run() tiene un bucle hasta que clockThread sea nulo. Dentro del bucle, el applet se repinta a s� mismo y le dice al Thread que espere durante 1 segudo (1000 milisegundos). Luego el m�todo repaint() del applet llama al m�todo paint() del applet, que actualiza el �rea de pantalla del applet.

El m�todo paint() de nuestro applet Clock obtiene la hora actual y la muestra en la pantalla.

public void paint(Graphics g) {
    Date now = new Date();
    g.drawString(now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), 5, 10);
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO