VisualVM - Estados de subprocesos

85

Por favor alguien puede explicar la diferencia entre Sleeping, Wait, Parky Monitorestados de rosca en VisualVM.

ingrese la descripción de la imagen aquí

Esto es lo que encontré:

Running: el hilo aún se está ejecutando.
Sleeping: el hilo está durmiendo (se llamó al método yield () en el objeto del hilo)
Wait: el hilo fue bloqueado por un mutex o una barrera, y está esperando que otro hilo libere el bloqueo
Park: los hilos estacionados se suspenden hasta que se les otorgue un permiso. El desempaquetado de un hilo generalmente se realiza llamando al método unpark () en el objeto del hilo
Monitor: los hilos están esperando con una condición para volverse verdadera para reanudar la ejecución

Lo que no puedo entender es el parque estatal, ¿qué suspende realmente el hilo? ¿Cómo detecto en el código qué ha hecho que el hilo suspenda su ejecución?

¿Puede alguien guiarme en este sentido?

Gracias.

Ali Shah Ahmed
fuente

Respuestas:

53

Encontré un diagrama muy agradable que describe bastante bien todo lo que necesitas / quieres saber.

ingrese la descripción de la imagen aquí

  1. Nuevo

El hilo está en un nuevo estado si crea una instancia de la clase Thread pero antes de la invocación del método start ().

  1. Runnable

El hilo está en estado ejecutable después de la invocación del método start (), pero el programador del hilo no lo ha seleccionado para que sea el hilo en ejecución.

  1. Corriendo

El subproceso está en estado de ejecución si el planificador de subprocesos lo ha seleccionado.

  1. Espera cronometrada

La espera temporizada es un estado de subproceso para un subproceso en espera con un tiempo de espera especificado. Un hilo se encuentra en el estado de espera temporizado debido a que se llama a uno de los siguientes métodos con un tiempo de espera positivo especificado:

  • Thread.sleep (tiempo de sueño)
  • Object.wait (tiempo de espera)
  • Thread.join (tiempo de espera)
  • LockSupport.parkNanos (tiempo de espera)
  • LockSupport.parkUntil (tiempo de espera)
  1. No ejecutable (bloqueado)

Este es el estado en el que el hilo aún está activo, pero actualmente no es elegible para ejecutarse.

  1. Terminado

Un hilo está en estado terminado o inactivo cuando su método run () sale.

Espero que esto responda a tu pregunta :).

Estacionamiento:

Desactiva el hilo actual para fines de programación de hilos a menos que el permiso esté disponible.

Los subprocesos se están estacionando o suspendiendo si desea llamarlo de esta manera porque no tiene permiso para ejecutarse. Una vez que se concede el permiso, el hilo se desempacará y se ejecutará.

Los permisos de LockSupport están asociados con subprocesos (es decir, el permiso se otorga a un subproceso en particular) y no se acumula (es decir, solo puede haber un permiso por subproceso, cuando el subproceso consume el permiso, desaparece).

Maciej Cygan
fuente
Gracias por su respuesta. También pasé por esto, pero de alguna manera mi pregunta seguía sin respuesta. ¿Podrías volver a leer mi pregunta? Lo he actualizado. Especialmente estoy buscando una respuesta sobre el estado del parque.
Ali Shah Ahmed
gracias de nuevo por la actualización. Entonces, en el estado del parque, ¿el hilo está esperando a que se programe o está esperando por alguna condición?
Ali Shah Ahmed
@AliShahAhmed El subproceso está esperando el permiso (condición) para ejecutarse, si esta condición no se cumple durante cierto período, se alcanza el tiempo de espera y el subproceso finaliza - PS. Perdón por demorar en contestar jaja
Maciej Cygan
39

VisualVM mapea el estado del hilo de Java (como se describe en la respuesta de @ Maciej) al estado presentado en su interfaz de usuario de la siguiente manera:

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

Sleepingy Parkson casos específicos de espera (cronometrada):

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

(El mapeo se realiza en ThreadMXBeanDataManager.java.)

Aquí se puede encontrar una breve (y no autorizada) discusión sobre el estado del hilo de Java .

EDITADO PARA AÑADIR:

También vale la pena señalar que los subprocesos que bloquean las llamadas a métodos nativos aparecen en la JVM como RUNNABLEy, por lo tanto, VisualVM los informa como Running(y consumen el 100% de la CPU).

Jeremy
fuente
2
Esta debería ser la respuesta correcta. La pregunta era sobre los estados del hilo de JVisualVM, no sobre los estados del hilo de JVM.
digital_infinity