Escribir Applets

Esta p�gina no explica el c�digo b�sico de los threads. Para aprender sobre la implementaci�n de threads Java puedes ir al tutorial Threads en Java: Hacer Dos o M�s Cosas a la Vez.

.�Usar un Thread para Realizar Tareas Repetitivas

Un applet que realiza la misma tarea una y otra vez normalmente deber�a tener un thread con un bucle while (o do...while) que realice la tarea. Un ejemplo t�pico es un applet que realiza animaci�n, como un juego. Los applets de animaci�n necesitan repintarse a intervalos regulares. Otro ejemplo es un applet que lee datos suministrados por una aplicaci�n del lado del servidor. (Puedes ver ejemplos en la p�gina Usar un Servidor para Evitar las Restricciones de Seguridad).

Normalmente se crean los threads para tareas repetitivas en el m�todo start del Applet. Crearlos aqu� hace m�s sencillo que el applet pare el thread cuando el usuario abandona la p�gina. Todo lo que necesitamos hacer es implementar el m�todo stop para que pare el thread del applet. Cuando un usuario retorna a la p�gina del applet, se llama de nuevo al m�todo start, y el applet puede crear otra vez su thread para realizar la tarea repetitiva.

Abajo est� la implementaci�n de los m�todos start y stop que hace el applet AnimatorApplet. (Aqu� est� el c�digo fuente completo).

public void start() {
    if (frozen) {
        //Do nothing.  The user has requested that we
        //stop changing the image.
    } else {
        //Start animating!
        if (animatorThread == null) {
            animatorThread = new Thread(this);
        }
        animatorThread.start();
    }
}

public void stop() {
    animatorThread = null;
}

El this de new Thread(this) indica que el applet proporciona el cuerpo del thread. Hace esto implementando el interface java.lang Runnable, que requiere que el applet proporcione un m�todo run que realiza el cuerpo del thread. Explicaremos el m�todo run de AnimatorApplet un poco m�s tarde.

Observa que en ning�n lugar de la clase AnimatorApplet se llama al m�todo Thread stop. Esto es porque llamar a este m�todo es como lanzar el thread por encima de nuestra cabeza. Es una forma dr�stica de hacer que un thread pare lo que est� haciendo. En su lugar, podemos escribir el m�todo run del thread para que el thread salga cuidadosamente cuando lo queramos eliminar. Esta eliminaci�n viene en la forma de seleccionar a null un ejemplar de variable del tipo Thread.

En AnimatorApplet, este ejemplar se llama animatorThread. El m�todo start lo selecciona para referirse al objeto Thread recien creado. Cuando el applet necesita eliminar el thread, selecciona animatorThread a null. Esto elimina el thread no marc�ndolo para el recolector de basura, puede ser recolectado mientras es ejecutable -- sino que al inicio del bucle el thread comprueba animatorThread, continuando o saliendo dependiendo del valor de animatorThread. Aqu� est� el c�digo relevante:

public void run() {
    . . .
    while (Thread.currentThread() == animatorThread) {
        ...//Display a frame of animation and then sleep.
    }
}

Si animatorThread se refiere al mismo thread que est� en ejecuci�n actualmente, el thread continua ejecut�ndose. Si, por otro lado, animatorThread es null, el thread sale. Si animatorThread se refiere a otro thread, entonces ocurre una condici�n de competici�n. start ha sido llamado tan pronto despu�s de stop (o este thread a tardado mucho tiempo en terminar su bucle) que start ha creado otro thread antes de que �ste haya llegado al bucle while. Cualquiera que sea la causa de la condici�n de competici�n, este thread debe salir.

.�Usar un Thread para Realizar Inicializaciones de un S�la Vez

Si nuestro applet necesita realizar alguna tarea de inicializaci�n que puede tardar mucho, deber�amos considerar la implementaci�n de la inicializaci�n en un thread. Por ejemplo, cualquier cosa que requiera hacer conexiones de red se deber�a hacer generalmente en un thread de segundo plano. Afortunadamente, la carga de im�genes GIF y JPEG se hace autom�ticamente en segundo plano usando threads de los que no tenemos que preocuparnos.

Pero desafortunadamente, la carga de sonidos no est� garantizada que se haga en segundo plano. En las implementaciones actuales, los m�todos Applet getAudioClip no retornan hasta que han cargado los datos de audio. Como resultado, si queremos precargar sonidos, podr�amos querer crear uno o m�s threads para hacerlo.

Usar un thread para realizar una inicializaci�n de una sola vez para un appelt es una variante del cl�sico escenario productor/consumidor. El thread que realiza la tarea es el productor, y el applet es el consumidor.

El ejemplo SoundExample crea tres clases:

Para m�s informaci�n sobre SoundExample, puedes ir a la p�gina Ejecutar Sonidos.

COMPARTE ESTE ARTÍCULO

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

SIGUIENTE ARTÍCULO