Threads de Control

El siguiente diagrama ilustra los distintos estados que puede tener un Thread Java en cualquier momento de su vida. Tambi�n ilustra las llamadas a m�todos que provocan las transiciones de un estado a otro. Este no es un diagrama de estado finito pero da un idea general del las facetas m�s interesantes y comunes en la vida de un thread. El resto de est� p�gina explica el ciclo de vida de un thread, bas�ndose en sus estados.

.�Un "Nuevo Thread"

La siguiente sentencia crea un nuevo thread pero no lo arranca, por lo tanto deja el thread en el estado : "New Thread" = "Nuevo Thread".

Thread miThread = new MiClaseThread();

Cuando un thread est� en este estado, es s�lo un objeto Thread vac�o. No se han asignado recursos del sistema todav�a para el thread. As�, cuando un thread est� en este estado, lo �nico que se puede hacer es arrancarlo o pararlo. Llamar a otros m�todos distintos de start() o stop() no tiene sentido y causa una excepci�n del tipo IllegalThreadStateException.

.�Ejecutable

Ahora consideremos estas dos l�neas de c�digo.

Thread miThread = new MiClaseThread();
miThread.start();

Cuando el m�todo start() crea los recursos del sistema necesarios para ejecutar el thread, programa el thread para ejecutarse, y llama al m�todo run() del thread. En este punto el thread est� en el estado "Ejecutable". Este estado se llama "Ejecutable" mejor que "Ejecutando" ya que el thread todav�a no ha empezado a ejecutarse cuando est� en este estado. Muchos procesadores tienen un s�lo procesador, haciendo posible que todos los threads sean "Ejecutables" al mismo tiempo. Por eso, el sistema de ejecuci�n de Java debe implementar un esquema de programaci�n para compartir el procesador entre todos los threads "Ejecutables".

(Puedes ver la p�gina Prioridad de un Thread para obtener m�s informaci�n sobre la programaci�n.) Sin embargo, para la mayor�a de los propositos puedes pensar en "Ejecutable" como un sencillo "Ejecutando". Cuando un thread se est� ejecutanto -- est� "Ejecutable" y es el thread actual -- las instrucciones de su m�todo run()se ejecutan de forma secuencial.

.�No Ejecutable

Un thread entra en el estado "No Ejecutable" cuando ocurre uno de estos cuatro eventos.

  • Alguien llama a su m�todo sleep().
  • Alguien llama a su m�todo suspend().
  • El thread utiliza su m�todo wait() para esperar una condici�n variable.
  • El thread est� bloqueado durante la I/O.

Por ejemplo, la l�nea en negrita del siguiente fragmento de codigo pone a dormir miThread durante 10 segundos (10.000 milisegundos).

Thread miThread = new MiClaseThread();
miThread.start();
try {
    miThread.sleep(10000);
} catch (InterruptedException e){
}

Durante los 10 segundos que miThread est� dormido, incluso si el proceso se vuelve disponible miThread no se ejecuta. Despu�s de 10 segundos, miThread se convierte en "Ejecutable" de nuevo y, si el procesar est� disponible se ejecuta.

Para cada entrada en el estado "No Ejecutable" mostrado en figura, existe una ruta de escape distinta y espec�fica que devuelve el thread al estado "Ejecutable". Una ruta de escape s�lo trabaja para su entrada correspondiente. Por ejemplo, si un thread ha sido puesto a dormir dutante un cierto n�mero de milisegundos deben pasar esos milisegundos antes de volverse "Ejecutable" de nuevo.

Llamar al m�todo resume() en un thread dormido no tiene efecto.

Esta lista indica la ruta de escape para cada entrada en el estado "No Ejecutable".

  • Si se ha puesto a dormir un thread, deben pasar el n�mero de milisegundos especificados.
  • Si se ha suspendido un thread, alguien debe llamar a su m�todo resume().
  • Si un thread est� esperando una condici�n variable, siempre que el objeto propietario de la variable renuncie mediante notify() o notifyAll().
  • Si un thread est� bloqueado durante la I/O, cuando se complete la I/O.

.�Muerto

Un thread puede morir de dos formas: por causas naturares o siendo asesinado (parado). Una muerte natural se produce cuando su m�todo run() sale normalmente. Por ejemplo, el bucle while en este m�todo es un bucle finito -- itera 100 veces y luego sale.

public void run() {
    int i = 0;
    while (i < 100) {
        i++;
        System.out.println("i = " + i);
    }
}

Un thread con este m�todo run() morir�a natualmente despu�s de que el bucle y el m�todo run() se hubieran completado.

Tambi�n puede matar un thread en cualquier momento llamando a su m�todo stop(). El siguiente c�digo crea y arranca miThread luego lo pone a dormir durante 10 segundos. Cuando el thread actual se despierta, la l�nea en negrita mata miThread.

Thread miThread = new MiClaseThread();
miThread.start();
try {
    Thread.currentThread().sleep(10000);
} catch (InterruptedException e){
}miThread.stop();

El m�todo stop() lanza un objeto ThreadDeath hacia al thread a eliminar. As�, cuando se mata al thread de esta forma, muere de forma as�ncrona. El thread moriri� cuando reciba realmente la excepci�n ThreadDeath.

El m�todo stop() provoca una terminaci�n s�bita del m�todo run() del thread. Si el m�todo run() estuviera realizando c�lculos sensibles, stop() podr�a dejar el programa en un estado inconsistente. Normalmente, no se deber�a llamar al m�todo stop() pero si se deber�a proporcionar una terminaci�n educada como la selecci�n de una bandera que indique que el m�todo run() deber�a salir.

.�La Excepci�n IllegalThreadStateException

El sistema de ejecuci�n lanza una excepci�n IllegalThreadStateException cuando llama a un m�todo en un thread y el estado del thread no pemmite esa llamada a m�todo.

Por ejemplo, esta excepci�n se lanza cuando se llama a suspend() en un thread que no est� "Ejecutable".

Como se ha mostrado en varios ejemplos de threads en est� lecci�n, cuando se llame a un m�todo de un thread que pueda lanzar una excepci�n, se debe capturar y manejar la excepci�n, o especificar al m�todo llamador que se lanza la excepci�n no capturada. Puedes ver la informaci�n sobre el manejo de excepciones en Java en Excepciones

.�El M�todo isAlive()

Una �ltima palabra sobre el estrado del thread: el interface de programaci�n de la clase Thread incluye un m�todo llamado isAlive(). Este m�todo devuelve true si el thread ha sido arrancado y no ha parado. As�, si el m�todo isAlive() devuelve false sabr�s que se trata de un "Nuevo thread" o de un thread "Muerto". Por el contrario si devuelve true sabr�s que el thread es� "Ejecutable" o "No Ejecutable". No se puede diferenciar entre un "Nuevo thread" y un thread "Muerto", como tampoco se puede hacer entre un thread "Ejecutable" y otro "No Ejecutable"

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO