logo

Gijos gyvavimo ciklas (gijos būsenos)

„Java“ gija visada egzistuoja bet kurioje iš šių būsenų. Šios būsenos yra:

  1. Nauja
  2. Aktyvus
  3. Užblokuota / laukiama
  4. Laiku nustatytas laukimas
  5. Nutraukta

Įvairių gijų būsenų paaiškinimas

Nauja: Kai sukuriama nauja gija, ji visada yra naujos būsenos. Naujos būsenos gijos kodas dar nebuvo paleistas, todėl jis nepradėjo vykdyti.

Aktyvus: Kai gija iškviečia start() metodą, ji pereina iš naujos būsenos į aktyvią būseną. Aktyvioje būsenoje yra dvi būsenos: viena yra paleidžiamas , o kitas yra bėgimas .

    Galima paleisti:Tada paruošta paleisti gija perkeliama į paleidimo būseną. Vykdomoje būsenoje gija gali veikti arba gali būti paruošta paleisti bet kuriuo momentu. Gijos planuotojo pareiga yra numatyti gijos veikimo laiką, t. y. perkelti giją į veikimo būseną.
    Programa, įgyvendinanti daugiagiją, kiekvienai atskirai gijai įgauna fiksuotą laiko dalį. Kiekviena gija veikia trumpą laiko tarpą, o pasibaigus šiam skirto laiko segmentui, gija savo noru atiduoda CPU kitai gijai, kad kitos gijos taip pat galėtų veikti savo laiko dalį. Kai tik įvyksta toks scenarijus, visos gijos, kurios nori paleisti, laukia savo eilės paleisti, yra paleidžiamoje būsenoje. Vykdomoje būsenoje yra eilė, kurioje yra gijos.Bėga:Kai gija gauna centrinį procesorių, ji pereina iš paleidimo į veikiančią būseną. Paprastai dažniausiai gijos būsenos pakeitimas yra iš paleidžiamo į paleidžiamą ir vėl į paleidžiamą.

Užblokuota arba laukiama: Kai gija tam tikrą laiką yra neaktyvi (ne visam laikui), gija yra užblokuotos arba laukiančios būsenos.

Pavyzdžiui, gija (tarkime, jos pavadinimas yra A) gali norėti spausdinti kai kuriuos duomenis iš spausdintuvo. Tačiau tuo pačiu metu kita gija (tarkime, jos pavadinimas yra B) naudoja spausdintuvą kai kuriems duomenims spausdinti. Todėl siūlas A turi palaukti, kol sriegis B naudos spausdintuvą. Taigi sriegis A yra užblokuotos būsenos. Užblokuotos būsenos gija negali atlikti jokio vykdymo ir todėl niekada nenaudoja jokio centrinio procesoriaus (CPU) ciklo. Taigi galime sakyti, kad gija A lieka neaktyvi, kol gijų planavimo priemonė iš naujo suaktyvina giją A, kuri yra laukiančios arba užblokuotos būsenos.

Kai pagrindinė gija iškviečia prisijungimo () metodą, sakoma, kad pagrindinė gija yra laukimo būsenoje. Tada pagrindinė gija laukia, kol antrinės gijos atliks savo užduotis. Kai antrinės gijos baigia savo darbą, į pagrindinę giją siunčiamas pranešimas, kuris vėl perkelia giją iš laukimo į aktyvią būseną.

Jei laukiančių arba užblokuotų gijų yra daug, tada gijų planuotojo pareiga yra nustatyti, kurią giją pasirinkti, o kurią atmesti, o pasirinktai gijai suteikiama galimybė paleisti.

Laukimas su laiku: Kartais laukimas priveda prie bado. Pavyzdžiui, gija (jos pavadinimas A) pateko į kritinę kodo dalį ir nenori išeiti iš šios kritinės dalies. Esant tokiam scenarijui, kita gija (jos pavadinimas B) turi laukti amžinai, o tai priveda prie bado. Kad būtų išvengta tokio scenarijaus, gijai B suteikiama laukimo būsena pagal laiką. Taigi gija yra laukimo būsenoje tam tikrą laiko tarpą, o ne amžinai. Tikras laukimo pagal laiką pavyzdys yra tada, kai mes iškviečiame miego () metodą konkrečioje gijoje. Sleep() metodas perkelia giją į laukimo laiką. Pasibaigus laikui, gija atsibunda ir pradeda vykdyti nuo tada, kai išėjo anksčiau.

Nutraukta: Gija pasiekia pabaigos būseną dėl šių priežasčių:

  • Kai gija baigia savo darbą, ji egzistuoja arba baigiasi įprastai.
  • Nenormalus nutraukimas:Taip nutinka, kai neįprasti įvykiai, pvz., netvarkoma išimtis arba segmentavimo klaida.

Nutraukta gija reiškia, kad gijos sistemoje nebėra. Kitaip tariant, gija negyva, ir jokiu būdu negalima atkurti (aktyvus po nužudymo) negyvos gijos.

Toliau pateiktoje diagramoje parodytos skirtingos būsenos, susijusios su gijos gyvavimo ciklu.

Java gijos gyvavimo ciklas

Siūlų būsenų įgyvendinimas

„Java“ dabartinę gijos būseną galima gauti naudojant Thread.getState() metodas. The java.lang.Thread.State Java klasė pateikia konstantas ENUM, kad parodytų gijos būseną. Šios konstantos yra:

kaip veikia kompiuteris
 public static final Thread.State NEW 

Tai reiškia pirmąją gijos būseną, kuri yra NAUJA būsena.

 public static final Thread.State RUNNABLE 

Tai reiškia paleidžiamą būseną. Tai reiškia, kad gija laukia eilėje, kad būtų paleista.

 public static final Thread.State BLOCKED 

Tai reiškia užblokuotą būseną. Šioje būsenoje sriegis laukia užrakto.

 public static final Thread.State WAITING 

Tai reiškia laukimo būseną. Gija pereis į šią būseną, kai iškvies Object.wait() metodą arba Thread.join() metodą be skirtojo laiko. Laukimo būsenos gija laukia, kol kita gija atliks savo užduotį.

 public static final Thread.State TIMED_WAITING 

Tai rodo laukimo laiką. Pagrindinis skirtumas tarp laukimo ir laukimo pagal laiką yra laiko apribojimas. Laukimas neturi laiko apribojimų, o laukimas turi laiko apribojimą. Gija, kuri iškviečia šį metodą, pasiekia laukimo pagal laiką būseną.

  • miegoti
  • prisijungti su skirtuoju laiku
  • laukti su laiku
  • parkasIki
  • parkNanos
 public static final Thread.State TERMINATED 

Tai reiškia galutinę gijos, kuri yra nutraukta arba negyva, būseną. Nutraukta gija reiškia, kad ji baigė vykdyti.

Java programa, skirta gijų būsenoms demonstruoti

Ši „Java“ programa rodo kai kurias aukščiau apibrėžtos gijos būsenas.

Failo pavadinimas: ThreadState.java

 // ABC class implements the interface Runnable class ABC implements Runnable { public void run() { // try-catch block try { // moving thread t2 to the state timed waiting Thread.sleep(100); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t1 while it invoked the method join() on thread t2 -'+ ThreadState.t1.getState()); // try-catch block try { Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } } } // ThreadState class implements the interface Runnable public class ThreadState implements Runnable { public static Thread t1; public static ThreadState obj; // main method public static void main(String argvs[]) { // creating an object of the class ThreadState obj = new ThreadState(); t1 = new Thread(obj); // thread t1 is spawned // The thread t1 is currently in the NEW state. System.out.println('The state of thread t1 after spawning it - ' + t1.getState()); // invoking the start() method on // the thread t1 t1.start(); // thread t1 is moved to the Runnable state System.out.println('The state of thread t1 after invoking the method start() on it - ' + t1.getState()); } public void run() { ABC myObj = new ABC(); Thread t2 = new Thread(myObj); // thread t2 is created and is currently in the NEW state. System.out.println('The state of thread t2 after spawning it - '+ t2.getState()); t2.start(); // thread t2 is moved to the runnable state System.out.println('the state of thread t2 after calling the method start() on it - ' + t2.getState()); // try-catch block for the smooth flow of the program try { // moving the thread t1 to the state timed waiting Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 after invoking the method sleep() on it - '+ t2.getState() ); // try-catch block for the smooth flow of the program try { // waiting for thread t2 to complete its execution t2.join(); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 when it has completed it's execution - ' + t2.getState()); } } 

Išvestis:

 The state of thread t1 after spawning it - NEW The state of thread t1 after invoking the method start() on it - RUNNABLE The state of thread t2 after spawning it - NEW the state of thread t2 after calling the method start() on it - RUNNABLE The state of thread t1 while it invoked the method join() on thread t2 -TIMED_WAITING The state of thread t2 after invoking the method sleep() on it - TIMED_WAITING The state of thread t2 when it has completed it's execution - TERMINATED 

Paaiškinimas: Kai sukuriame naują giją, ši gija pasiekia naują būseną. Kai gijoje iškviečiamas metodas start(), gijų planavimo priemonė perkelia tą giją į paleidimo būseną. Kai bet kuriame gijos egzemplioriuje iškviečiamas prisijungimo () metodas, dabartinė gija, vykdanti tą sakinį, turi palaukti, kol ši gija baigs vykdyti, t. y. perkelti tą giją į baigtą būseną. Todėl prieš išspausdinant galutinį spausdinimo teiginį konsolėje, programa iškviečia metodą join() gijoje t2, todėl gija t1 laukia, kol gija t2 baigs vykdyti, taigi gija t2 pereis į baigtą arba negyvą būseną. . Sriegis t1 pereina į laukimo būseną, nes laukia, kol gija t2 baigs jos vykdymą, nes gijoje t2 ji iškvietė metodą join().