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.
|