Qual é a diferença entre o estado de thread WAIT e o estado de thread BLOCKED?
Bloqueado
Um encadeamento que está bloqueado à espera de um bloqueio de monitor está neste estado.Aguardando
Um encadeamento que está esperando indefinidamente por outro encadeamento para realizar uma ação específica está neste estado
não explica a diferença para mim.
java
multithreading
block
wait
Mais de cinco
fonte
fonte
Respostas:
Um thread vai para o estado de espera quando chama
wait()
um objeto. Isso é chamado de estado de espera . Uma vez que um thread atinge o estado de espera, ele precisará esperar até que algum outro thread chamenotify()
ounotifyAll()
no objeto.Assim que este tópico for notificado, ele não poderá ser executado. Pode ser que outros tópicos também sejam notificados (usando
notifyAll()
) ou o primeiro tópico não terminou seu trabalho, então ele ainda está bloqueado até ter sua chance. Isso é chamado de estado bloqueado . Um estado Blocked ocorrerá sempre que um thread tenta adquirir o bloqueio no objeto e algum outro thread já está segurando o bloqueio.Uma vez que outros encadeamentos saíram e sua chance de encadeamento, ele se move para o estado Executável depois que é elegível para pegar o trabalho com base no mecanismo de encadeamento da JVM e se move para o estado de execução.
fonte
A diferença é relativamente simples.
No
BLOCKED
estado, um thread está prestes a entrar em umsynchronized
bloco, mas há outro thread em execução dentro de umsynchronized
bloco no mesmo objeto. O primeiro thread deve então esperar que o segundo thread saia de seu bloco.No
WAITING
estado, um segmento está aguardando um sinal de outro segmento. Isso normalmente acontece por meio de uma chamadaObject.wait()
, ouThread.join()
. O encadeamento permanecerá neste estado até que outro encadeamento chameObject.notify()
ou morra.fonte
Object.wait()
diretamente, mas acaba noWAITING
estado de usar também as construções de simultaneidade de alto nível - como bloqueios, filas de bloqueio, etc ... falando de maneira geral, sempre que dois threads precisam ser coordenados.RUNNING
estado.Thread.State
diz, "... Esses estados são estados de máquina virtual que não refletem nenhum estado de thread do sistema operacional." Em outras palavras, a JVM não se preocupa com a diferença entre um encadeamento que está executando o código Java, um encadeamento que está aguardando o retorno de uma chamada do sistema ou um encadeamento que está aguardando um intervalo de tempo. Tudo issoRUNNABLE
diz respeito apenas à JVM.WAITING
estado, ele deve primeiro ir para oBLOCKED
estado até que possa adquirir o bloqueio associado ao objeto que estava esperando.A diferença importante entre os estados de bloqueio e espera é o impacto no planejador. Um thread em um estado bloqueado está lutando por um bloqueio; esse thread ainda conta como algo que o planejador precisa atender, possivelmente sendo fatorado nas decisões do planejador sobre quanto tempo dar aos threads em execução (para que possa dar uma chance aos threads que bloqueiam o bloqueio).
Quando um thread está no estado de espera, o estresse que ele coloca no sistema é minimizado e o planejador não precisa se preocupar com isso. Ele fica inativo até receber uma notificação. Exceto pelo fato de que ele mantém um thread do sistema operacional ocupado, está totalmente fora de jogo.
É por isso que usar o notificar tudo é menos do que o ideal, ele faz com que um monte de threads que antes estavam adormecidos sem carga no sistema sejam ativados, onde a maioria deles irá bloquear até que possam adquirir o bloqueio, encontrar a condição em que estão esperar não é verdade e volte a esperar. Seria preferível notificar apenas os threads que têm chance de fazer progresso.
(Usar ReentrantLock em vez de bloqueios intrínsecos permite que você tenha várias condições para um bloqueio, para que você possa ter certeza de que o thread notificado está aguardando uma condição específica, evitando o bug de notificação perdida no caso de um thread sendo notificado por algo em que não pode agir.)
fonte
Perspectiva simplificada para interpretar despejos de thread:
fonte
RUNNABLE
não está certo. Pode estar na fila de execução do Java, mas não em execução, ou pode estar executando o código Java. Não precisa ser um chamado para a terra natal.Blocked- Seu segmento está em estado executável do ciclo de vida do segmento e tentando obter bloqueio de objeto. Wait- Seu segmento está em estado de espera do ciclo de vida do segmento e aguardando o sinal de notificação para entrar no estado executável do segmento.
fonte
veja este exemplo:
demonstração dos estados dos fios.
fonte