¿Cuál es la diferencia entre el estado del hilo WAIT y el estado del hilo BLOQUEADO?
La documentación de Thread.State :
Bloqueado
Un subproceso que está bloqueado esperando un bloqueo de monitor se encuentra en este estado.En espera
Un subproceso que está esperando indefinidamente a que otro subproceso realice una acción en particular se encuentra en este estado
no me explica la diferencia.
java
multithreading
block
wait
Más de cinco
fuente
fuente
Respuestas:
Un hilo pasa al estado de espera una vez que llama
wait()
a un objeto. Esto se llama Estado de espera . Una vez que un hilo alcanza el estado de espera, tendrá que esperar hasta que otro hilo llamenotify()
onotifyAll()
en el objeto.Una vez que se notifique este hilo, no se podrá ejecutar. Puede ser que otros hilos también sean notificados (usando
notifyAll()
) o que el primer hilo no haya terminado su trabajo, por lo que aún está bloqueado hasta que tenga su oportunidad. Esto se llama estado bloqueado . Se producirá un estado bloqueado siempre que un subproceso intente adquirir un bloqueo en un objeto y algún otro subproceso ya esté bloqueando el bloqueo.Una vez que otros subprocesos se han ido y es esta posibilidad de subproceso, se mueve al estado Ejecutable después de que es elegible para recoger trabajo basado en el mecanismo de subprocesamiento de JVM y se mueve al estado de ejecución.
fuente
La diferencia es relativamente simple.
En el
BLOCKED
estado, un hilo está a punto de entrar en unsynchronized
bloque, pero hay otro hilo que se está ejecutando actualmente dentro de unsynchronized
bloque en el mismo objeto. El primer hilo debe esperar a que el segundo hilo salga de su bloque.En el
WAITING
estado, un hilo está esperando una señal de otro hilo. Esto sucede normalmente llamandoObject.wait()
, oThread.join()
. El hilo permanecerá en este estado hasta que otro hilo llameObject.notify()
o muera.fuente
Object.wait()
directamente, pero termina en elWAITING
estado también usando las construcciones de concurrencia de más alto nivel, como bloqueos, colas de bloqueo, etc., en términos generales, siempre que dos subprocesos tienen que coordinarse.RUNNING
estado.Thread.State
dice: "... Estos estados son estados de máquinas virtuales que no reflejan ningún estado de subprocesos del sistema operativo". En otras palabras, a la JVM no le importa la diferencia entre un subproceso que ejecuta código Java, un subproceso que está esperando a que regrese una llamada del sistema o un subproceso que está esperando un intervalo de tiempo. Esos son todos en loRUNNABLE
que respecta a la JVM.WAITING
estado, primero debe ir alBLOCKED
estado hasta que pueda adquirir el bloqueo asociado con el objeto que estaba esperando.La diferencia importante entre los estados bloqueado y de espera es el impacto en el planificador. Un hilo en un estado bloqueado está compitiendo por un bloqueo; ese hilo todavía cuenta como algo que el programador necesita atender, posiblemente siendo un factor en las decisiones del programador sobre cuánto tiempo dar a los hilos en ejecución (para que pueda dar una oportunidad a los hilos que bloquean el bloqueo).
Una vez que un hilo está en estado de espera, el estrés que ejerce en el sistema se minimiza y el programador no tiene que preocuparse por ello. Permanece inactivo hasta que recibe una notificación. Excepto por el hecho de que mantiene un hilo del sistema operativo ocupado, está completamente fuera de juego.
Esta es la razón por la que el uso de notifyAll es menos que ideal, hace que un grupo de subprocesos que antes estaban felizmente inactivos y sin carga en el sistema se despierten, donde la mayoría de ellos se bloquearán hasta que puedan adquirir el bloqueo, encontrar la condición en la que se encuentran. esperar no es cierto, y vuelva a esperar. Sería preferible notificar solo a aquellos hilos que tienen posibilidades de progresar.
(El uso de ReentrantLock en lugar de bloqueos intrínsecos le permite tener múltiples condiciones para un bloqueo, de modo que pueda asegurarse de que el hilo notificado sea uno que esté esperando en una condición particular, evitando el error de notificación perdida en el caso de que se notifique un hilo para algo sobre lo que no puede actuar).
fuente
Perspectiva simplificada para interpretar volcados de hilo:
fuente
RUNNABLE
no está del todo bien. Podría estar en la cola de ejecución de Java pero no se está ejecutando o podría estar ejecutando código Java. No tiene por qué estar llamando a la tierra natal.Bloqueado: su subproceso está en un estado ejecutable del ciclo de vida del subproceso e intenta obtener el bloqueo de objeto. Esperar: su hilo está en estado de espera del ciclo de vida del hilo y esperando que la señal de notificación entre en estado ejecutable del hilo.
fuente
mira este ejemplo:
demostración de estados de hilo.
fuente