Ciclul de viață al firului și stările firului - 1

"Bună, Amigo!"

„Vom începe un subiect nou: firele”.

„Să începem. Astăzi vom examina stările prin care trece un obiect Thread (sau ar putea trece prin) atunci când rulează un thread.”

— Câte state poți numi chiar acum, Amigo?

„Doi. Primul este un fir înainte ca metoda start() să fie apelată: obiectul există, dar firul nu este încă activ. Și al doilea este după ce metoda start() a fost apelată: când firul face ceva important."

"Ai dreptate - există o astfel de distincție. Aceste stări se numesc noi și în curs de funcționare , dar acesta este doar începutul."

„În primul rând, la un moment dat firul de execuție se va termina de rulat, ceea ce înseamnă că poate exista o situație în care obiectul Thread există, dar firul de execuție nu este în starea nouă sau în curs de funcționare. „Această stare, în care firul de execuție s-a terminat, se numește terminat .”

„Dar mai sunt. Nu uitați că, la un moment dat, doar un fir rulează de fapt. Ceea ce pare a fi lucru simultan este, de fapt, procesorul care sare în mod constant de la thread la thread. Există o stare separată pentru când firul pare să fie rulează, dar își așteaptă de fapt rândul: se numește gata de rulare . Pe măsură ce un fir de execuție funcționează, trece constant de la rulare la gata , iar apoi din nou la rulare când devine activ din nou."

„Imediat după ce metoda start () este apelată, firului de execuție i se atribuie starea gata de rulare și plasat într-o listă partajată de fire de execuție între care comută JVM-ul.”

"Nu este prea dificil. Înainte de a începe să ruleze, are noua stare. După ce s-a terminat, se termină . Când rulează, firul este în starea de rulare ; apoi când așteaptă, este în starea gata . ."

„Scuritatea ta este uimitoare, dar ai dreptate”.

„Dar mai sunt. Firul poate fi blocat. De exemplu, când intri într-un bloc sincronizat . Dacă un fir ajunge la un bloc de cod marcat ca sincronizat și un alt thread îl folosește, atunci firul nostru va intra în starea blocată și va aștepta pentru ca mutexul (blocarea) obiectului să fie eliberat."

„Iată cum arată această situație cu statele:”

Ciclul de viață al firului și stările firului - 2

„Dar mai sunt. Există și o stare separată numită așteptare . Aceasta este atunci când un fir de execuție nu este blocat , dar nici nu este pregătit . De exemplu, când apelați metoda join () pe un alt fir.”

Când apelăm join() pe un alt obiect Thread, este ca și cum firul nostru „se alătură”, dar în realitate așteaptă doar ca celălalt thread să se termine.

„În plus, există și metoda wait () (din trioul de metode wait/notify/notifyAll), care comută un fir de execuție în starea de așteptare atunci când este apelat.”

— Uau.

„Așteptați un minut! Mai sunt mai multe. Un thread poate dormi apelând metoda sleep, de exemplu. Există, de asemenea, o stare separată pentru aceasta. Se numește « așteptare temporizată ». « așteptare temporizată » înseamnă că firul așteaptă ceva pentru un timp limitat. Dacă apelați o metodă de așteptare cu un parametru, cum ar fi wait(timeout) sau join(timeout), atunci firul de execuție va intra în starea de așteptare cronometrată."

"Iată diagrama completă:"

Ciclul de viață al firului și stările firului - 3

"Hmm. Asta e tot? Sau mai sunt 10 stări interesante?"

— Deocamdată, asta este.

"În practică, vă puteți aminti prima diagramă. Este mai simplă. Dar a doua este mai precisă."

„Destul de ciudat, există o mulțime de diagrame de stare a firelor pe Internet și toate sunt diferite.”

„De aceea ți-am dat această diagramă – este cea mai completă și mai corectă”.

„În această diagramă, stările gata și de rulare sunt combinate într-un singur bloc numit rulabil. Știi de ce?”

— Nu. E prima dată când văd așa ceva.

„ Clasa Thread are o clasă internă numită State , precum și o metodă publică State getState() ”.

Exemplu
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

„Puteți oricând să apelați metoda getState () pe un obiect Thread și să aflați starea lui curentă. Și, desigur, va fi una dintre valorile State enum.”

"Înțeleg. Deci, stările reale sunt în interiorul JVM-ului, dar există și stări pe care le puteți accesa prin cod Java folosind metoda State getState()".

— Și în ce circumstanțe aș folosi asta?

— Cel mai probabil, niciodată.

„Dar trebuie să știi ce se întâmplă în firele. În caz contrar, vei avea o mulțime de bug-uri și nici măcar nu vei putea ghici ce le cauzează.”

„În plus, angajatorilor le place să întrebe despre stările Thread în timpul interviurilor.”