Znalazłem bardzo ładny diagram, który w zasadzie opisuje wszystko, co potrzebujesz / chcesz wiedzieć.
- Nowy
Wątek jest w nowym stanie, jeśli utworzysz wystąpienie klasy Thread, ale przed wywołaniem metody start ().
- 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.
- Bieganie
Wątek jest uruchomiony, jeśli program planujący wątki go wybrał.
- 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)
- Niedziałający (zablokowany)
Jest to stan, w którym wątek nadal żyje, ale obecnie nie może zostać uruchomiony.
- 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).
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:
Sleeping
iPark
są to szczególne przypadki (w określonym czasie) oczekiwania:(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 jakoRunning
(i jako zużywające 100% CPU).źródło