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