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

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

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

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

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

Может кто-нибудь, пожалуйста, направьте меня в этом отношении.

Благодарю.

2 ответа

Решение

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

1) Новый

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

2) Runnable

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

3) Бег

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

4) Время ожидания

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

  • Thread.sleep (отхода ко сну)
  • Object.wait (тайм-аут)
  • Thread.join (тайм-аут)
  • LockSupport.parkNanos (тайм-аут)
  • LockSupport.parkUntil (тайм-аут)

5) Не работает (заблокировано)

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

6) Прекращено

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

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

Стоянка:

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

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

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

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

Другие вопросы по тегам