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.

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).


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).


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.