Подтвердить что ты не робот

VisualVM - состояния резьбы

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

enter image description here

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

Running: поток все еще запущен.

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

enter image description here

1) Новый

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

2) Runnable

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

3) Выполнение

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

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

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

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

5) Non-Runnable (Blocked)

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

6) Заканчивается

Поток заканчивается или мертв, когда его метод run() завершает работу.

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

Парковка:

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

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

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

Ответ 2

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

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

Sleeping и Park - это конкретные случаи ожидания (timed):

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