FACULTAD DE CIENCIAS DE LA COMPUTACION
 
 
 

Estados de un hilo

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

 

 



 
     

 

 

 

 

     
Hosted by www.Geocities.ws

1 1