Durante el ciclo de vida de un thread, �ste se puede encontrar en diferentes estados. La figura siguiente muestra estos estados y los m�todos que provocan el paso de un estado a otro. Este diagrama no es una m�quina de estados finita, pero es lo que m�s se aproxima al funcionamiento real de un thread .

Nuevo Thread
La siguiente sentencia crea un nuevo thread pero no lo arranca, lo deja en el estado de "Nuevo Thread":
Thread MiThread = new MiClaseThread();
Cuando un thread est� en este estado, es simplemente un objeto Thread vac�o. El sistema no ha destinado ning�n recurso para �l. Desde este estado solamente puede arrancarse llamando al m�todo start(), o detenerse definitivamente, llamando al m�todo stop(); la llamada a cualquier otro m�todo carece de sentido y lo �nico que provocar� ser� la generaci�n de una excepci�n de tipo IllegalThreadStateException.
Ejecutable
Ahora veamos las dos l�nea de c�digo que se presentan a continuaci�n:
Thread MiThread = new MiClaseThread();
MiThread.start();
La llamada al m�todo start() crear� los recursos del sistema necesarios para que el thread puede ejecutarse, lo incorpora a la lista de procesos disponibles para ejecuci�n del sistema y llama al m�todo run() del thread. En este momento nos encontramos en el estado "Ejecutable" del diagrama. Y este estado es Ejecutable y no En Ejecuci�n, porque cuando el thread est� aqu� no esta corriendo. Muchos ordenadores tienen solamente un procesador lo que hace imposible que todos los threads est�n corriendo al mismo tiempo. Java implementa un tipo de scheduling o lista de procesos, que permite que el procesador sea compartido entre todos los procesos o threads que se encuentran en la lista. Sin embargo, para nuestros prop�sitos, y en la mayor�a de los casos, se puede considerar que este estado es realmente un estado "En Ejecuci�n", porque la impresi�n que produce ante nosotros es que todos los procesos se ejecutan al mismo tiempo.
Cuando el thread se encuentra en este estado, todas las instrucciones de c�digo que se encuentren dentro del bloque declarado para el m�todo run(), se ejecutar�n secuencialmente.
Parado
El thread entra en estado "Parado" cuando alguien llama al m�todo suspend(), cuando se llama al m�todo sleep(), cuando el thread est� bloqueado en un proceso de entrada/salida o cuando el thread utiliza su m�todo wait() para esperar a que se cumpla una determinada condici�n. Cuando ocurra cualquiera de las cuatro cosas anteriores, el thread estar� Parado.
Por ejemplo, en el trozo de c�digo siguiente:
Thread MiThread = new MiClaseThread();
MiThread.start();
try {
MiThread.sleep( 10000 );
} catch( InterruptedException e ) {
;
}
la l�nea de c�digo que llama al m�todo sleep():
MiThread.sleep( 10000 );
hace que el thread se duerma durante 10 segundos. Durante ese tiempo, incluso aunque el procesador estuviese totalmente libre, MiThread no correr�a. Despu�s de esos 10 segundos. MiThread volver�a a estar en estado "Ejecutable" y ahora s� que el procesador podr�a hacerle caso cuando se encuentre disponible.
Para cada una de los cuatro modos de entrada en estado Parado, hay una forma espec�fica de volver a estado Ejecutable. Cada forma de recuperar ese estado es exclusiva; por ejemplo, si el thread ha sido puesto a dormir, una vez transcurridos los milisegundos que se especifiquen, �l solo se despierta y vuelve a estar en estado Ejecutable. Llamar al m�todo resume() mientras est� el thread durmiendo no servir�a para nada.
Los m�todos de recuperaci�n del estado Ejecutable, en funci�n de la forma de llegar al estado Parado del thread, son los siguientes:
- Si un thread est� dormido, pasado el lapso de tiempo
- Si un thread est� suspendido, luego de una llamada al m�todo resume()
- Si un thread est� bloqueado en una entrada/salida, una vez que el comando E/S concluya su ejecuci�n
- Si un thread est� esperando por una condici�n, cada vez que la variable que controla esa condici�n var�e debe llamarse a notify() o notifyAll()
Muerto
Un thread se puede morir de dos formas: por causas naturales o porque lo maten (con stop()). Un thread muere normalmente cuando concluye de forma habitual su m�todo run(). Por ejemplo, en el siguiente trozo de c�digo, el bucle while es un bucle finito -realiza la iteraci�n 20 veces y termina-:
public void run() {
int i=0;
while( i < 20 )
{
i++;
System.out.println( "i = "+i );
}
}
Un thread que contenga a este m�todo run(), morir� naturalmente despu�s de que se complete el bucle y run() concluya.
Tambi�n se puede matar en cualquier momento un thread, invocando a su m�todo stop(). En el trozo de c�digo siguiente:
Thread MiThread = new MiClaseThread();
MiThread.start();
try {
MiThread.sleep( 10000 );
} catch( InterruptedException e ) {
;
}
MiThread.stop();
se crea y arranca el thread MiThread, lo dormimos durante 10 segundos y en el momento de despertarse, la llamada a su m�todo stop(), lo mata.
El m�todo stop() env�a un objeto ThreadDeath al thread que quiere detener. As�, cuando un thread es parado de este modo, muere as�ncronamente. El thread morir� en el momento en que reciba la excepci�n ThreadDeath.
Los applets utilizar�n el m�todo stop() para matar a todos sus threads cuando el navegador con soporte Java en el que se est�n ejecutando le indica al applet que se detengan, por ejemplo, cuando se minimiza la ventana del navegador o cuando se cambia de p�gina.
El metodo isAlive()
La interface de programaci�n de la clase Thread incluye el m�todo isAlive(), que devuelve true si el thread ha sido arrancado (con start()) y no ha sido detenido (con stop()). Por ello, si el m�todo isAlive() devuelve false, sabemos que estamos ante un "Nuevo Thread" o ante un thread "Muerto". Si nos devuelve true, sabemos que el thread se encuentra en estado "Ejecutable" o "Parado". No se puede diferenciar entre "Nuevo Thread" y "Muerto", ni entre un thread "Ejecutable" o "Parado
|