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 ()
excelente explicación, me sirvió para entender mejor este importante tema
ResponderEliminar