Starea firului de execuție Java Introducere cu exemplu – Ciclul de viață al unui fir

Publicat: 2019-01-11
Introducere despre starea firului Java cu exemplu

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.

Stare de fir Java cu exemplu

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ă.

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:

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

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() fie notifyAll() .
  • Dacă un fir este blocat pe I/O, atunci comanda I/O specificată trebuie să se finalizeze.
java-thread-tutorial

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.

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.

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.