VisualVM - estados de thread

86

Alguém por favor pode me explicar a diferença entre Sleeping, Wait, Park, e Monitorestados de rosca em VisualVM.

insira a descrição da imagem aqui

Isto é o que encontrei:

Running: thread ainda está em execução.
Sleeping: thread está dormindo (método yield () foi chamado no objeto thread)
Wait: thread foi bloqueado por um mutex ou uma barreira e está esperando por outro thread para liberar o bloqueio
Park: threads estacionados são suspensos até que recebam uma permissão. O desbloqueio de um thread geralmente é feito chamando o método unpark () no objeto do thread
Monitor: os threads estão esperando que uma condição se torne verdadeira para retomar a execução

O que eu não consigo entender é o parque estadual, o que realmente suspende o fio? Como posso detectar no código o que fez o thread suspender sua execução?

Alguém pode me orientar a esse respeito.

Obrigado.

Ali Shah Ahmed
fonte

Respostas:

53

Eu encontrei um diagrama muito bom que descreve muito bem tudo o que você precisa / deseja saber.

insira a descrição da imagem aqui

  1. Novo

O thread está em um novo estado se você criar uma instância da classe Thread, mas antes da invocação do método start ().

  1. Executável

O encadeamento está em estado executável após a invocação do método start (), mas o planejador de encadeamento não o selecionou para ser o encadeamento em execução.

  1. Corrida

O thread está em estado de execução se o planejador de thread o tiver selecionado.

  1. Tempo de espera

A espera cronometrada é um estado de thread para um thread em espera com um tempo de espera especificado. Um encadeamento está no estado de espera cronometrado devido à chamada de um dos seguintes métodos com um tempo de espera positivo especificado:

  • Thread.sleep (tempo de sono)
  • Object.wait (tempo limite)
  • Thread.join (tempo limite)
  • LockSupport.parkNanos (tempo limite)
  • LockSupport.parkUntil (tempo limite)
  1. Não executável (bloqueado)

Este é o estado em que o thread ainda está ativo, mas atualmente não é elegível para execução.

  1. Rescindido

Um thread está em estado finalizado ou morto quando seu método run () é encerrado.

Espero que isso responda sua pergunta :).

Estacionamento:

Desativa o thread atual para fins de agendamento de thread, a menos que a permissão esteja disponível.

Threads estão sendo estacionados ou suspensos, se você quiser chamá-lo dessa forma, porque não tem permissão para executar. Assim que a permissão for concedida, o thread será desestacionado e executado.

As permissões de LockSupport estão associadas a threads (isto é, a permissão é dada a uma thread em particular) e não se acumulam (ou seja, pode haver apenas uma licença por thread, quando a thread consome a permissão, ela desaparece).

Maciej Cygan
fonte
Obrigado pela sua resposta. Eu também passei por isso, mas de alguma forma minha pergunta ainda permanecia sem resposta. Você poderia, por favor, repassar minha pergunta; Eu atualizei isso. Estou especialmente procurando uma resposta sobre o estado do parque.
Ali Shah Ahmed
obrigado novamente pela atualização. Então, no estado de parque, o thread está esperando que seja agendado ou está esperando por alguma condição?
Ali Shah Ahmed
@AliShahAhmed Thread está aguardando permissão (condição) para executar - se esta condição não for atendida por um determinado período, o tempo limite será atingido e o thread será encerrado - PS. Desculpe pela demora em responder haha
Maciej Cygan
40

VisualVM mapeia o estado do thread Java (conforme descrito na resposta de @Maciej) para o estado apresentado em sua IU da seguinte maneira:

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

Sleepinge Parksão casos específicos de espera (cronometrada):

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(O mapeamento é executado em ThreadMXBeanDataManager.java.)

Uma breve (e não oficial) discussão sobre o estado do thread Java pode ser encontrada aqui .

EDITADO PARA ADICIONAR:

Também é importante notar que os threads que bloqueiam as chamadas para métodos nativos aparecem na JVM como RUNNABLE e, portanto, são relatados pelo VisualVM como Running(e consomem 100% da CPU).

Jeremy
fonte
3
Esta deve ser a resposta correta. A questão era sobre os estados de encadeamento JVisualVM, não os estados de encadeamento JVM.
digital_infinity