VisualVM - Состояния потоков

86

Может кто - то пожалуйста , объясните мне разницу между Sleeping, Wait, Parkи Monitorсостояния резьбы в VisualVM.

введите описание изображения здесь

Вот что я нашел:

Running: thread все еще работает.
Sleeping: поток спит (для объекта потока был вызван метод yield ())
Wait: поток был заблокирован мьютексом или барьером и ожидает, пока другой поток освободит блокировку
Park: припаркованные потоки приостанавливаются, пока им не будет предоставлено разрешение. Снятие парковки с потока обычно выполняется путем вызова метода unpark () для объекта потока
Monitor: потоки ожидают выполнения условия для возобновления выполнения.

Что я не могу понять, так это государственный парк, что на самом деле приостанавливает поток? Как мне определить в коде, что заставило поток приостановить выполнение?

Может ли кто-нибудь помочь мне в этом отношении.

Благодарю.

Али Шах Ахмед
источник

Ответы:

53

Я нашел очень красивую диаграмму, которая в значительной степени описывает все, что вам нужно / что вы хотите знать.

введите описание изображения здесь

  1. Новый

Поток находится в новом состоянии, если вы создаете экземпляр класса Thread, но до вызова метода start ().

  1. Работоспособен

Поток находится в рабочем состоянии после вызова метода start (), но планировщик потоков не выбрал его в качестве выполняемого потока.

  1. Бег

Поток находится в рабочем состоянии, если планировщик потоков выбрал его.

  1. Время ожидания

Время ожидания - это состояние потока для потока, ожидающего с указанным временем ожидания. Поток находится в состоянии ожидания по времени из-за вызова одного из следующих методов с заданным положительным временем ожидания:

  • Thread.sleep (время сна)
  • Object.wait (тайм-аут)
  • Thread.join (тайм-аут)
  • LockSupport.parkNanos (тайм-аут)
  • LockSupport.parkUntil (тайм-аут)
  1. Не запускается (заблокировано)

Это состояние, когда поток еще жив, но в настоящее время не может быть запущен.

  1. Прекращено

Когда завершается его метод run (), поток находится в завершенном или мертвом состоянии.

Надеюсь, это ответит на ваш вопрос :).

Стоянка:

Отключает текущий поток для целей планирования потоков, если разрешение не доступно.

Потоки припаркованы или приостановлены, если вы хотите называть это так, потому что у него нет разрешения на выполнение. Как только разрешение будет предоставлено, поток будет отменен и выполнен.

Разрешения LockSupport связаны с потоками (т.е. разрешение дается определенному потоку) и не накапливаются (т.е. может быть только одно разрешение на поток, когда поток использует разрешение, оно исчезает).

Мацей Циган
источник
Спасибо за ваш ответ. Я тоже прошел через это, но почему-то мой вопрос так и остался без ответа. Не могли бы вы повторить мой вопрос еще раз; Я его обновил. Специально ищу ответ по поводу состояния парка.
Али Шах Ахмед
еще раз спасибо за обновление. Итак, в состоянии park ожидает ли поток выполнения расписания или он ожидает при каком-то условии?
Али Шах Ахмед
@AliShahAhmed Поток ожидает разрешения (условия) для выполнения - если это условие не выполняется в течение определенного периода времени, истекает время ожидания и поток завершается - PS. Извините за задержку с ответом, ха-ха
Maciej Cygan
40

VisualVM отображает состояние потока Java (как описано в ответе @ Maciej) на состояние, представленное в его пользовательском интерфейсе, следующим образом:

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

Sleepingи Parkявляются конкретными случаями (рассчитанного) ожидания:

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

(Отображение выполняется в ThreadMXBeanDataManager.java.)

Краткое (и не авторитетное) обсуждение состояния потока Java можно найти здесь .

ИЗМЕНЕНО ДОБАВИТЬ:

Также стоит отметить, что потоки, блокирующие вызовы собственных методов, отображаются в JVM как RUNNABLEи, следовательно, VisualVM сообщает как Running(и как потребляющие 100% ЦП).

Джереми
источник
3
Это должен быть правильный ответ. Вопрос касался состояний потока JVisualVM, а не состояний потока JVM.
digital_infinity