Cykl życia wątku i stany wątków - 1

"Cześć, Amigo!"

„Zaczniemy nowy temat: wątki”.

„Zaczynajmy. Dzisiaj zbadamy stany, przez które obiekt Thread przechodzi (lub może przechodzić), gdy wątek jest uruchomiony”.

„Ile stanów potrafisz teraz wymienić, Amigo?”

„Dwa. Pierwszy to wątek przed wywołaniem metody start(): obiekt istnieje, ale wątek nie jest jeszcze aktywny. Drugi to wątek po wywołaniu metody start(): gdy wątek coś robi ważny."

„Masz rację — jest takie rozróżnienie. Te stany nazywamy new i running , ale to dopiero początek”.

„Po pierwsze, w pewnym momencie wątek zakończy działanie, co oznacza, że ​​może zaistnieć sytuacja, w której obiekt Thread istnieje, ale wątek nie jest w stanie nowym lub uruchomionym”. „Ten stan, w którym wątek zakończył działanie, nazywa się rozwiązany ”.

„Ale jest coś więcej. Nie zapominaj, że w danym momencie działa tylko jeden wątek. To, co wydaje się równoczesną pracą, to w rzeczywistości procesor nieustannie przeskakujący z wątku na wątek. Istnieje osobny stan, w którym wątek wydaje się być uruchomiony działa, ale tak naprawdę czeka na swoją kolej: nazywa się to gotowym do uruchomienia . Gdy wątek działa, stale przełącza się z trybu uruchomionego na gotowy , a następnie z powrotem do działania , gdy ponownie staje się aktywny.

„Natychmiast po wywołaniu metody start () wątek otrzymuje status gotowości do uruchomienia i zostaje umieszczony na wspólnej liście wątków, pomiędzy którymi przełącza się JVM.”

„To nie jest zbyt trudne. Zanim zacznie działać, ma nowy stan. Po zakończeniu zostaje zakończony . Gdy działa, wątek jest w stanie uruchomionym , a gdy czeka, jest w stanie gotowości ”.

„Twoja zwięzłość jest niesamowita, ale masz rację”.

„Ale to nie wszystko. Wątek może zostać zablokowany. Na przykład, gdy wejdziesz do zsynchronizowanego bloku. Jeśli wątek dotrze do bloku kodu oznaczonego jako zsynchronizowany i inny wątek go używa, wtedy nasz wątek przejdzie w stan zablokowany i będzie czekał aby muteks (blokada) obiektu został zwolniony”.

„Oto jak wygląda ta sytuacja ze stanami:”

Cykl życia wątków i stany wątków - 2

„Ale to nie wszystko. Istnieje również osobny stan zwany oczekiwaniem . Dzieje się tak, gdy wątek nie jest zablokowany , ale także nie jest gotowy . Na przykład, gdy wywołujesz metodę join () w innym wątku”.

Kiedy wywołujemy join() na innym obiekcie Thread, to tak, jakby nasz wątek „dołączył” do niego, ale w rzeczywistości po prostu czeka, aż drugi wątek się zakończy.

„Dodatkowo istnieje również metoda wait () (z trio metod wait/notify/notifyAll), która przełącza wątek do stanu oczekiwania , gdy jest wywoływany”.

"Wow."

„Chwileczkę! Jest jeszcze więcej. Wątek może zostać uśpiony, na przykład wywołując metodę uśpienia. Istnieje również oddzielny stan. Nazywa się to „oczekiwanie w określonym czasie. ograniczony czas. Jeśli wywołasz metodę oczekiwania z parametrem, takim jak wait(timeout) lub join(timeout), wówczas wątek wejdzie w stan oczekiwania na określony czas.

„Oto pełny schemat:”

Cykl życia wątków i stany wątków - 3

„Hmm. Czy to wszystko? A może jest 10 bardziej interesujących stanów?”

– Na razie to wszystko.

„W praktyce wystarczy zapamiętać pierwszy diagram. Jest prostszy. Ale drugi jest dokładniejszy”.

„Co dziwne, w Internecie jest wiele diagramów stanów wątków i wszystkie są różne”.

„Dlatego dałem ci ten diagram — jest najbardziej kompletny i poprawny”.

„Na tym schemacie stany gotowości i działania są połączone w jeden blok o nazwie runnable. Czy wiesz dlaczego?”

„Nie. Pierwszy raz widzę coś takiego”.

„ Klasa Thread ma wewnętrzną klasę o nazwie State , a także publiczną metodę State getState() ”.

Przykład
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

„Zawsze możesz wywołać metodę getState () na obiekcie Thread i sprawdzić jego aktualny stan. I oczywiście będzie to jedna z wartości wyliczeniowych State”.

„Rozumiem. Tak więc prawdziwe stany znajdują się wewnątrz JVM, ale są też stany, do których można uzyskać dostęp za pośrednictwem kodu Java za pomocą metody State getState()”.

– A w jakich okolicznościach miałbym tego użyć?

„Najprawdopodobniej nigdy”.

„Ale musisz wiedzieć, co dzieje się wewnątrz wątków. W przeciwnym razie będziesz mieć wiele błędów i nawet nie będziesz w stanie odgadnąć, co je powoduje”.

„Ponadto pracodawcy uwielbiają pytać o stany wątków podczas rozmów kwalifikacyjnych”.