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"