Utilización de threads en applets

Un applet puede ejecutarse con varias threads, y en muchas ocasiones será necesario o conveniente hacerlo así. Hay que tener en cuenta que un applet se ejecuta siempre en un browser (o en la aplicación appletviewer).

Así, las threads en las que se ejecutan los métodos mayores -init(), start(), stop() y destroy()-dependen del browser o del entorno de ejecución. Los métodos gráficos -paint(), update() y repaint()- se ejecutan siempre desde una thread especial del AWT.

Algunos browsers dedican un thread para cada applet en una misma página; otros crean un grupo de threads para cada applet (para poderlas matar al mismo tiempo, por ejemplo). En cualquier caso se garantiza que todas las threads creadas por los métodos mayores pertenecen al mismo grupo.

Se deben introducir threads en applets siempre que haya tareas que consuman mucho tiempo (cargar una imagen o un sonido, hacer una conexión a Internet, …). Si estas tareas pesadas se ponen en el método init() bloquean cualquier actividad del applet o incluso de la página HTML hasta que se completan. Las tareas pesadas pueden ser de dos tipos:

• Las que sólo se hacen una vez.

• Las que se repiten muchas veces.

Un ejemplo de tarea que se repite muchas veces puede ser una animación. En este caso, la tarea repetitiva se pone dentro de un bucle while o do…while, dentro del thread. El thread se debería crear dentro del método start() del applet y destruirse en stop(). De este modo, cuando el applet no está visible se dejan de consumir recursos.

Al crear el thread en el método start() se pasa una referencia al applet con la palabra this, que se refiere al applet. El applet deberá implementar la interface Runnable, y por tanto debe definir el método run(), que es el centro del Thread.

Un ejemplo de tarea que se realiza una sola vez es la carga de imágenes *.gif o *.jpeg, que ya se realiza automáticamente en un thread especial.

Sin embargo, los sonidos no se cargan en threads especiales de forma automática; los debe crear el programador para cargarlos en “background”. Este es un caso típico de programa producer-consumer: el thread es el producer y el applet el consumer. Las threads deben estar sincronizadas, para lo que se utilizan los métodos wait() y notifyAll().

A continuación se presenta un ejemplo de thread con tarea repetitiva:

public void start() {
if (repetitiveThread == null) {
repetitiveThread = new Thread(this); // se crea un nuevo thread
}
repetitiveThread.start(); // se arranca el thread creado: start() llama a run()
}
public void stop() {
repetitiveThread = null; // para parar la ejecución del thread
}
public void run() {

while (Thread.currentThread() == repetitiveThread) {
… // realizar la tarea repetitiva.
}
}

El método run() se detendrá en cuanto se ejecute el método stop(), porque la referencia al thread está a null.

Fuente: Aprenda Java como si estuviera en primero de la Universidad de Navarra