viernes, 19 de octubre de 2012

Estados de un Thread


Estado Nuevo
El Thread ha sido creado pero no inicializado, es decir, no se ha ejecutado todavía el método start(). Se producirá un mensaje de error (IllegalThreadStateException) si se intenta ejecutar cualquier método de la clase Thread distinto de start().

Estado Ejecutable
El Thread puede estar ejecutándose, siempre y cuando se le haya asignado un determinado tiempo de CPU. En la practica puede no estar siendo ejecutado en un instante determinado en beneficio de otro thread.

Estado Bloqueado
El Thread podría estar ejecutándose, pero hay alguna actividad interna suya que lo impide, como por ejemplo una espera producida por una operación de escritura o lectura de datos por teclado (E/S). Si un Thread esta en este estado, no se le asigna tiempo de CPU.


Estado Muerto
La forma habitual de que un Thread muera es finalizando el método run(). También puede llamarse al método stop() de la clase Thread, aunque como ya mencionamos, dicho método es considerado “peligroso” y no debe utilizarse

Ampliación del diagrama de ciclo de vida
Ampliando los conceptos del diagrama anterior, un Thread desde su ejecución hasta su muerte pasa por diversos estados de vida. Estos estados y sus transiciones se muestran en forma mas detallada en el diagrama siguiente:

Un Thread tras su creación pasa a estado LISTO de ahí puede pasar EN EJECUCION o no, esto dependerá de un Thread propio de Java denominado Dispatcher, que es el encargado de otorgarle a un Thread el recurso del procesador para que pueda ejecutarse.

Una vez EN EJECUCION procesara su código hasta que se le acabe el tiempo asignado (también llamado Quantum) por la JVM o bien hasta que termine (si le da tiempo), o también se puede dar el caso de que alguien lo elimine mediante stop().

Los Threads pasaran a ejecución dependiendo de sus prioridades y de acuerdo a la implementación de la JVM.

Una vez EN EJECUCION los Threads pueden, o pasar a LISTO de nuevo (si se acaba el Quantum) o pasar a otros estados, a saber: EN ESPERA, DORMIDO, SUSPENDIDO y BLOQUEADO. Esto dependerá de la ejecución de ciertos métodos sobre el Thread(o la ocurrencia de ciertos sucesos).

Un Thread pasara a DORMIDO cuando se invoque el método sleep(), permanecerá asi (sin consumir recursos) hasta que se le acabe el tiempo de “siesta”, momento en el que volverá a LISTO. En este estado, el Thread no consume recursos, es decir, no es candidato a serle asignado el procesador hasta que no despierte.

El Thread pasara a BLOQUEADO cuando tenga que sufrir una espera debida a E/S, saldrá de este estado en cuanto termine la E/S (tampoco consume recursos mientras espera).

El estado SUSPENDIDO es para aquellos Threads que han sufrido la invocación del método suspend(), en este estado permanecerán hasta que alguien los llame mediante resume. Por supuesto tampoco consume recursos en este estado.

Y por ultimo el Thread pasara a EN ESPERA cuando alguien invoque un wait(), entonces el Thread pasara a esperar en un pool de Threads. Esto implica que la próxima vez que se ejecute un notify(), el Thread se despertara. También podemos ejecutar notifyAll(), de forma que sacamos a todos del pool.

Resumiendo, 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 esta bloqueado durante I/O
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 esta esperando una condición variable, siempre que el objeto propietario de la variable renuncie mediante notify () o notifyAll ().
·         Si un Thread esta bloqueado durante I/O, cuando se complete la I/O
Un Thread puede morir de dos formas: por causas naturales o siendo asesinado (parado). Una muerte natural se produce cuando su método run () sale normalmente. Se puede matar a un Thread en cualquier momento llamando a su método stop ().
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 ()

1 comentario:

  1. excelente explicación, me sirvió para entender mejor este importante tema

    ResponderEliminar