Programación en castellano
Inicio > Tutoriales > J2SE > Escribir Applets
-Tutoriales

Escribir Applets


Threads en Applets: Ejemplo

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.

 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados