Applets Java


En esta p�gina:

  • Ejecuci�n multihilo en applets

Ejecuci�n multihilo en applets

Hasta ahora s�lo dispon�amos de un hilo de ejecuci�n. Es decir, en nuestros programas s�lo se ejecuta una cosa al tiempo. Si deseamos que se ejecuten varias cosas a la vez o simplemente deseamos disponer de una manera precisa de controlar la ejecuci�n de parte de nuestro programa dependiendo del tiempo, necesitaremos que nuestro applet realice una ejecuci�n multihilo.

El concepto de multitarea es diferente al de multihilo. El primero se suele aplicar a la ejecuci�n concurrente de programas distintos, ya que para que exista multitarea se exige que cada proceso ejecut�ndose disponga de su propio espacio en la memoria. En el segundo caso, en cambio, todos los hilos que se ejecutan concurrentemente disponen del mismo espacio de memoria.

Pero no vamos a escribir un tratado filos�fico sobre las diversas formas de programaci�n concurrente. Lo mejor que podemos hacer es explicarlo sobre un ejemplo. El ejemplo siguiente es una modificaci�n del applet MostrarMensaje, realizado anteriormente, que realiza un scroll lateral del texto, que aparece por la derecha y desaparece por la izquierda. El c�digo nuevo que concierne a la ejecuci�n multihilo est� en negrita para facilitar su identificaci�n:

Rotacion.java
/**
 * Applet MostrarCadena
 *
 * <APPLET CODE="MostrarCadena.class" WIDTH="200" HEIGHT="70">
 *   <PARAM NAME="Cadena" VALUE="Esto s� que es chulo">
 * </APPLET>
 */

import java.applet.Applet;
import java.awt.*;

public class MostrarCadena extends Applet implements Runnable {
  String mensaje;
  int lugar;
  Thread hilo = null;
  public void init() {
    mensaje = getParameter("cadena");
    if (mensaje==null)
      mensaje = "Mensaje por defecto";
    lugar = getBounds().width;
  }
  public void start() {
    if (hilo==null) {
      hilo = new Thread(this);
      hilo.start();
    }
  }
  public void stop() {
    hilo = null;
  }
  public void paint(Graphics g) {
    g.drawString(mensaje,lugar,20);
  }
  public void run() {
    while (hilo!=null && hilo.isAlive()) {
      lugar -= 1;
      repaint();
      try {
        hilo.sleep(10);
      }
      catch (InterruptedException e) {} // No hacemos nada
    }
  }
}

Lo primero es asegurarnos que nuestro applet implementa el interfaz Runnable, necesario para el soporte de threads, o hilos de ejecuci�n. Despu�s declaramos un objeto de tipo Thread, es decir, hilo, y lo igualamos a null. En el m�todo start(), que es donde debe "estart" todo el c�digo de inicializaci�n, creamos el hilo y lo arrancamos llamando a su m�todo start(). En stop(), por el contrario, lo paramos.

El m�todo run() es nuevo y es consecuencia de la implementaci�n del interfaz Runnable. Cuando creamos un hilo de ejecuci�n, como hemos hecho en start(), el hilo reci�n creado siempre comienza su vida �til ejecutando el m�todo run(). As� pues, aqu� estar� el c�digo del hilo. Comenzamos preguntando si existe nuestro hilo (hilo!=null) y si est� ejecutandose (isAlive).

Luego mueve el texto un poco a la izquierda, repinta, y se obliga a s� mismo a dejar de ejecutarse durante 10 milisegundos por medio del m�todo sleep(). Transcurrido ese tiempo seguir� su ejecuci�n por el mismo sitio donde la dej� (de ah� que sea necesario el while).

Indicar por �ltimo que es obligatorio capturar la excepci�n InterruptedException para poder llamar al m�todo sleep(). En caso contrario el compilador se queja. As� pues, lo hacemos, aunque no especifiquemos ning�n c�digo en caso de que se lance dicha excepci�n. Esto ocurrir� en casos muy excepcionales, por lo que no debemos preocuparnos.