Transición de estado de hilo de Java, ESPERANDO a BLOQUEADO, o EJECUTABLE?


Parece haber una discrepancia entre el consenso SO y casi todos los diagramas de estado de hilo Java en Internet; específicamente, con respecto a la transición de estado de hilo de WAITING después de que se invoque notify() o notifyAll()...

  • ESPERANDO nunca va directamente a EJECUTABLE
  • El hilo está ESPERANDO hasta que se notifique...Entonces se vuelve BLOQUEADO...
  • Una vez notificado este hilo, no será runnable ...Esto es..Estado Bloqueado.

Así que el consenso en SO es: una transición de hilo de WAITING a BLOCKED después de invocar notify() o notifyAll(); el diagrama de abajo ilustra esta transición en verde.

Pregunta

¿Por qué la mayoría de diagramas de estado en la web ilustran la transición de WAITING a RUNNABLE, no BLOCKED? La representación en rojo muestra la transición incorrecta; ¿me estoy perdiendo algo?

introduzca la descripción de la imagen aquí

Author: Community, 2015-02-07

3 answers

Cualquier diagrama que muestre una invocación notify trayendo un hilo de ESPERA a EJECUTABLE es incorrecto (o está usando un atajo no aclarado). Una vez que un hilo se despierta de un notify (o incluso de un despertar espurio) necesita volver a bloquear el monitor del objeto en el que estaba esperando. Este es el BLOCKED estado.

Estado del hilo para un hilo bloqueado esperando un bloqueo de monitor. Hilo en el estado bloqueado está a la espera de que un bloqueo de monitor sincronizar bloque / método o volver a introducir un bloque/método sincronizado después llamando a Object.wait.

Esto se explica en el javadoc de Object#notify():

El hilo despertado no podrá continuar hasta que la corriente thread abandona el bloqueo de este objeto.

Y Object#wait()

El hilo entonces espera hasta que pueda volver a obtener la propiedad del monitor y reanuda la ejecución.

 11
Author: Sotirios Delimanolis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-07 05:08:44

Me estoy centrando en el problema recientemente.

Como el hilo del documento Oracle .State dice que podemos usar LockSupport.park () para poner el hilo actual en estado 'WAITING' o 'TIMED_WAITING'.

Así que cuando intentes el soporte de bloqueo .unpark () , el hilo especificado volverá a 'RUNNABLE' desde 'WAITING'/'TIMED_WAITING'. (No estoy seguro de si pasará por el estado 'BLOQUEADO')

 0
Author: hgfeaon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 16:20:58

Un hilo ESPERANDO estado va en BLOQUE estado,hasta que adquiere el monitor de notificar y se convierten RUNNABLE.

Lo mismo se aplica para TIMEDWAITING, va en estado BLOCK, si el monitor está retenido por algún otro hilo,aunque haya pasado el tiempo especificado. (su diagrama necesita ser corregido)

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-02 21:01:34