VisualVM - Stany wątków

86

Czy ktoś mógłby mi wyjaśnić różnicę między Sleeping, Wait, Parkoraz Monitorstanów wątek w VisualVM.

wprowadź opis obrazu tutaj

Oto, co znalazłem:

Running: wątek nadal działa.
Sleeping: wątek śpi (na obiekcie wątku została wywołana metoda yield ())
Wait: wątek został zablokowany przez muteks lub barierę i czeka na zwolnienie blokady przez inny wątek
Park: zaparkowane wątki są zawieszane do czasu uzyskania pozwolenia. Odparkowanie wątku jest zwykle wykonywane przez wywołanie metody unpark () na obiekcie wątku
Monitor: wątki czekają na spełnienie warunku, aby wznowić wykonywanie

To, czego nie rozumiem, to stanowy park, co właściwie wstrzymuje wątek? Jak wykryć w kodzie, co sprawiło, że wątek zawiesił wykonanie?

Czy ktoś może mnie poprowadzić w tym zakresie.

Dzięki.

Ali Shah Ahmed
źródło

Odpowiedzi:

53

Znalazłem bardzo ładny diagram, który w zasadzie opisuje wszystko, co potrzebujesz / chcesz wiedzieć.

wprowadź opis obrazu tutaj

  1. Nowy

Wątek jest w nowym stanie, jeśli utworzysz wystąpienie klasy Thread, ale przed wywołaniem metody start ().

  1. Runnable

Wątek jest w stanie gotowym do uruchomienia po wywołaniu metody start (), ale program planujący wątki nie wybrał go jako działającego wątku.

  1. Bieganie

Wątek jest uruchomiony, jeśli program planujący wątki go wybrał.

  1. Czas oczekiwania

Czas oczekiwania jest stanem wątku dla wątku oczekującego z określonym czasem oczekiwania. Wątek znajduje się w czasowym stanie oczekiwania z powodu wywołania jednej z następujących metod z określonym dodatnim czasem oczekiwania:

  • Wątek. Sen (czas snu)
  • Object.wait (limit czasu)
  • Thread.join (limit czasu)
  • LockSupport.parkNanos (limit czasu)
  • LockSupport.parkUntil (limit czasu)
  1. Niedziałający (zablokowany)

Jest to stan, w którym wątek nadal żyje, ale obecnie nie może zostać uruchomiony.

  1. Zakończony

Wątek znajduje się w stanie zakończonym lub martwym, gdy jego metoda run () kończy działanie.

Mam nadzieję, że to odpowiada na Twoje pytanie :).

Parking:

Wyłącza bieżący wątek do celów planowania wątków, chyba że zezwolenie jest dostępne.

Wątki są parkowane lub zawieszane, jeśli chcesz nazywać to w ten sposób, ponieważ nie ma uprawnień do wykonywania. Po przyznaniu pozwolenia wątek zostanie odparkowany i wykonany.

Zezwolenia LockSupport są powiązane z wątkami (tj. Zezwolenie jest udzielane określonemu wątkowi) i nie kumuluje się (tzn. Może być tylko jedno zezwolenie na wątek, gdy wątek zużywa zezwolenie, znika).

Maciej Cygan
źródło
Dzięki za twoją odpowiedź. Ja też przez to przeszedłem, ale jakoś moje pytanie pozostało bez odpowiedzi. Czy mógłbyś ponownie przejść przez moje pytanie; Zaktualizowałem to. Specjalnie szukam odpowiedzi w stanie parku.
Ali Shah Ahmed
jeszcze raz dziękuję za aktualizację. Czy w stanie parku wątek czeka, aż zostanie zaplanowany, czy też czeka pod jakimś warunkiem?
Ali Shah Ahmed,
@AliShahAhmed Wątek oczekuje na pozwolenie (warunek) na wykonanie - jeśli ten warunek nie zostanie spełniony przez określony czas, zostanie osiągnięty limit czasu i wątek zostanie zakończony - PS. Przepraszam za opóźnienie w odpowiedzi haha
Maciej Cygan
39

VisualVM odwzorowuje stan wątku Java (jak opisano w odpowiedzi @ Macieja) na stan przedstawiony w jego interfejsie użytkownika w następujący sposób:

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

Sleepingi Parksą to szczególne przypadki (w określonym czasie) oczekiwania:

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

(Mapowanie jest wykonywane w ThreadMXBeanDataManager.java.)

Krótkie (i nieautorytatywne) omówienie stanu wątku Java można znaleźć tutaj .

EDYTOWANO DO DODANIA:

Warto również zauważyć, że wątki blokujące wywołania metod natywnych pojawiają się w JVM jako RUNNABLE, a zatem są zgłaszane przez VisualVM jako Running(i jako zużywające 100% CPU).

Jeremy
źródło
2
To powinna być prawidłowa odpowiedź. Pytanie dotyczyło stanów wątku JVisualVM, a nie stanów wątku JVM.
digital_infinity