Starea firului de execuție Java Introducere cu exemplu – Ciclul de viață al unui fir
Publicat: 2019-01-11
Stările firului
Următoarea diagramă ilustrează diferitele stări în care se poate afla un fir de execuție Java în orice moment al vieții sale și care apeluri de metodă provoacă o tranziție la o altă stare. Această diagramă nu este o diagramă completă cu stări finite, ci mai degrabă o privire de ansamblu asupra fațetelor mai interesante și mai comune ale vieții unui fir.
Sunteți la locul potrivit dacă aveți oricare dintre întrebările de mai jos:
- Ciclul de viață al unui fir în Java
- Ciclul de viață și stările unui fir în Java
- Înțelegerea stărilor de fir Java
Restul acestei pagini discută Thread's life cycle
în ceea ce privește starea acestuia.

Thread nou
Următoarea instrucțiune creează un fir nou, dar nu îl pornește, lăsând astfel firul în starea etichetată New Thread în diagramă.
1 |
Thread myThread = new MyThreadClass ( ) ; |
Când un fir de execuție se află în starea New Thread
, este doar un obiect Thread gol. Nu au fost alocate încă resurse de sistem pentru aceasta. Astfel, atunci când un thread este în această stare, puteți doar să începeți sau să îl opriți; apelarea oricărei alte metode în afară de start()
sau stop()
atunci când un fir este în această stare nu are sens și provoacă o excepție IllegalThreadStateException.
Rugabil
Acum luați în considerare aceste două linii de cod:
1 2 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; |
Metoda start()
creează resursele de sistem necesare rulării firului de execuție, programează rularea firului de execuție și apelează metoda run()
a firului de execuție. În acest moment, firul este în starea „Runnable”. Această stare se numește „Runnable” mai degrabă decât „Running” deoarece thread-ul poate să nu ruleze de fapt atunci când este în această stare. Multe computere au un singur procesor, ceea ce face imposibilă rularea simultană a tuturor thread-urilor „Runnable”.
Deci, sistemul de rulare Java trebuie să implementeze o schemă de programare care împarte procesorul între toate firele de execuție „Runnable”. Cu toate acestea, în majoritatea scopurilor, vă puteți gândi la starea „Runnable” ca pur și simplu „Running”. Când rulează un fir de execuție – este „Runnable” și este firul de execuție curent – instrucțiunile din run()
se execută secvenţial.
Nu se poate rula
Un fir de execuție intră în starea Not Runnable
atunci când are loc unul dintre aceste patru evenimente:
- cineva își apelează metoda
suspend()
- cineva își numește metoda
sleep()
- firul folosește metoda
wait()
pentru a aștepta o variabilă de condiție - firul se blochează pe I/O.
De exemplu, linia aldine din acest fragment de cod
1 2 3 4 5 6 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; try { myThread . sleep ( 10000 ) ; } catch ( InterruptedException e ) { } |
pune myThread
în stare de adormire timp de 10 secunde (10.000 de milisecunde). În acele 10 secunde, chiar dacă procesorul ar fi devenit disponibil myThread
nu ar mai rula. După expirarea celor 10 secunde, myThread
devine din nou „Runnable” și acum, dacă procesorul devine disponibil myThread
ar rula.
Pentru fiecare dintre „intrările” în starea „Nu se poate rula” enumerate mai sus, există o rută de evadare specifică și distinctă care readuce firul de execuție în starea „Rulabil”. O cale de evacuare funcționează doar pentru „intrarea” corespunzătoare. De exemplu, dacă un fir de execuție a fost pus în repaus, atunci numărul specificat de milisecunde trebuie să treacă înainte ca firul de execuție să devină din nou „Runnable”. Apelarea resume()
pe un fir de adormire nu are efect.
Următoarele indică calea de evacuare pentru fiecare intrare în starea „Nu se poate rula”.

- Dacă un fir a fost pus în repaus, atunci trebuie să treacă numărul specificat de milisecunde.
- Dacă un fir de execuție a fost suspendat, atunci cineva trebuie să-i apeleze metoda
resume()
. - Dacă un fir de execuție așteaptă o variabilă de condiție, orice obiect deține variabila trebuie să renunțe la ea apelând fie
notify()
fienotifyAll()
. - Dacă un fir este blocat pe I/O, atunci comanda I/O specificată trebuie să se finalizeze.

Mort
Un fir poate muri în două moduri: fie din cauze naturale, fie fiind ucis (oprit). Un fir de execuție moare în mod natural când metoda sa run()
iese normal. De exemplu, bucla while
din această metodă este o buclă finită – va repeta de 100 de ori și apoi va ieși.
1 2 3 4 5 6 7 |
public void run ( ) { int i = 0 ; while ( i < 100 ) { i ++ ; System . out . println ( "i = " + i ) ; } } |
Un fir cu această metodă run()
va muri în mod natural după finalizarea buclei și metoda run()
.
De asemenea, puteți închide un fir de execuție în orice moment, apelând metoda stop()
. Acest fragment de cod.
1 2 3 4 5 6 7 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; try { Thread . currentThread ( ) . sleep ( 10000 ) ; } catch ( InterruptedException e ) { } myThread . stop ( ) ; |
creează și pornește myThread
, apoi pune firul curent în repaus timp de 10 secunde. Când firul curent se trezește, linia îngroșată din segmentul de cod omoara myThread
.
Metoda stop()
aruncă un obiect ThreadDeath în fir pentru a-l ucide. Astfel, atunci când un fir este ucis în acest mod, moare asincron. Firul va muri când primește excepția ThreadDeath.
IllegalThreadStateException
Sistemul de execuție lansează o excepție IllegalThreadStateException atunci când apelați o metodă pe un fir de execuție și starea acelui fir de execuție nu permite apelul acelei metode. De exemplu, IllegalThreadStateException este aruncată atunci când apelați suspend()
pe un fir care nu este „Runnable”.
După cum se arată în diferitele exemple de fire de execuție de până acum în această lecție, atunci când apelați o metodă de fire care poate arunca o excepție, trebuie fie să capturați și să gestionați excepția, fie să declarați că metoda de apelare aruncă excepția neprinsă.
Metoda isAlive().
Și un ultim cuvânt despre starea firului: interfața de programare pentru clasa Thread include o metodă numită isAlive()
. isAlive()
returnează adevărat dacă firul de execuție a fost pornit și nu oprit. Astfel, dacă metoda isAlive()
returnează false , știți că firul de execuție este fie „Fir nou”, fie „Mort”.
Dacă metoda isAlive()
returnează true , știți că firul de execuție este fie „Runnable”, fie „Not Runnable”. Nu puteți face diferența între un fir „New Thread” și unul „Mort”; și nici nu puteți face diferența între un fir „Runnable” și un thread „Not Runnable”.
Privind exemplele complexe de fire, am găsit acest tutorial foarte grozav pe net. Toată lumea ar trebui să citească acest lucru cu atenție.