Življenjski cikel in stanja niti v Javi

Življenjski cikel in stanja niti v Javi

A nit v Javi lahko kadar koli obstaja v katerem koli od naslednjih stanj. Nit je v katerem koli trenutku le v enem od prikazanih stanj:

  1. Nova država
  2. Zagonsko stanje
  3. Blokirano stanje
  4. Čakalno stanje
  5. Časovno določeno čakalno stanje
  6. Končano stanje

Spodnji diagram predstavlja različna stanja niti v katerem koli trenutku:

Življenjski cikel-in-stanja-niti-v-Javi


Življenjski cikel niti 

Obstaja več stanj niti v življenjskem ciklu, kot je navedeno spodaj:

  1. Nova nit: Ko se ustvari nova nit, je v novo stanje . Nit se še ni začela izvajati, ko je nit v tem stanju. Ko je nit v novem stanju, je treba njeno kodo še izvajati in se ni začela izvajati.
  2. Zagonsko stanje : Nit, ki je pripravljen za tek se premakne v zagonsko stanje. V tem stanju se lahko nit dejansko izvaja ali pa je pripravljena za izvajanje v katerem koli trenutku. Razporejevalnik niti je odgovoren, da da niti čas za izvajanje. Večnitni program vsaki posamezni niti dodeli fiksno količino časa. Vsaka nit ima malo časa za izvajanje. Ko nekaj časa teče, se nit ustavi in ​​opusti CPE, da lahko druge niti delujejo.
  3. Blokirano: Nit bo v blokiranem stanju ko poskuša pridobiti ključavnico vendar trenutno zaklepanje pridobi druga nit. Ko pridobi zaklepanje, se nit premakne iz blokiranega stanja v zagonsko stanje.
  4. Čakalno stanje : Nit bo v stanju čakanja ko pokliče čakaj() metoda oz pridruži se() metoda. Ko bo druga nit obvestila ali bo ta prekinjena, se bo premaknila v zagonsko stanje.
  5. Časovno čakanje : Nit je v časovno določenem čakalnem stanju, ko je pokliče metodo s parametrom časovne omejitve . Nit je v tem stanju, dokler se ne izteče časovna omejitev ali dokler ni prejeto obvestilo. Na primer, ko nit pokliče spanje ali pogojno čakanje, se premakne v časovno določeno čakajoče stanje.
  6. Končano stanje: Nit se prekine zaradi enega od naslednjih razlogov: 
    • Ker izstopa normalno. To se zgodi, ko je program v celoti izvedel kodo niti.
    • Ker je prišlo do nenavadnega napačnega dogodka, kot je napaka segmentacije ali neobravnavana izjema.

Stanje niti v Javi

V Javi za pridobitev trenutnega stanja niti uporabite Thread.getState() metoda za pridobitev trenutnega stanja niti. Java ponuja java.lang.Thread.State enum, ki definira konstante ENUM za stanje niti, katerih povzetek je podan spodaj: 

1. Novo 

Stanje niti za nit, ki se še ni začela. 

javni statični končni Thread.State NOVO

2. Izvedljivo 

Stanje niti za zagonsko nit. Nit v zagonskem stanju se izvaja v navideznem stroju Java, vendar morda čaka na druge vire iz operacijskega sistema, kot je procesor. 

javni statični končni Thread.State RUNNABLE

3. Blokirano 

Stanje niti za blokirano nit, ki čaka na zaklepanje monitorja. Nit v blokiranem stanju čaka na zaklepanje monitorja za vstop v sinhronizirani blok/metodo ali ponovni vnos sinhroniziranega bloka/metode po klicu Object.wait(). 

javni statični končni Thread.State BLOCKED

4. Čakanje 

 Stanje niti za čakajočo nit. Nit je v stanju čakanja zaradi klica ene od naslednjih metod: 

  • Object.wait brez časovne omejitve
  • Thread.join brez časovne omejitve
  • LockSupport.park

javni statični končni Thread.State WAITING

5. Časovno čakanje 

Stanje niti za čakajočo nit z določenim čakalnim časom. Nit je v časovno omejenem čakalnem stanju zaradi klica ene od naslednjih metod z določenim pozitivnim čakalnim časom: 

  • Nit.spi
  • Object.wait s časovno omejitvijo
  • Thread.join s časovno omejitvijo
  • LockSupport.parkNanos
  • LockSupport.parkUntil

javni statični končni Thread.State TIMED_WAITING

6. Prekinjeno 

Stanje niti za prekinjeno nit. Nit je zaključila izvedbo. 

javni statični končni Thread.State TERMINATED


Primer prikazovanja stanj niti

Spodaj je resničen primer sistema za rezervacijo vstopnic, ki prikazuje različna stanja niti:

primer:

Java
   // Java program to demonstrate thread states    // using a ticket booking scenario   class   TicketBooking     implements     Runnable     {      @Override      public     void     run  ()     {          try     {          // Timed waiting      Thread  .  sleep  (  200  );         }     catch     (  InterruptedException     e  )     {      e  .  printStackTrace  ();      }      System  .  out  .  println  (  'State of bookingThread while mainThread is waiting: '     +      TicketSystem  .  mainThread  .  getState  ());      try     {          // Another timed waiting      Thread  .  sleep  (  100  );         }     catch     (  InterruptedException     e  )     {      e  .  printStackTrace  ();      }      }   }   public     class   TicketSystem     implements     Runnable     {      public     static     Thread     mainThread  ;      public     static     TicketSystem     ticketSystem  ;      @Override      public     void     run  ()     {      TicketBooking     booking     =     new     TicketBooking  ();      Thread     bookingThread     =     new     Thread  (  booking  );      System  .  out  .  println  (  'State after creating bookingThread: '     +     bookingThread  .  getState  ());      bookingThread  .  start  ();      System  .  out  .  println  (  'State after starting bookingThread: '     +     bookingThread  .  getState  ());      try     {      Thread  .  sleep  (  100  );      }     catch     (  InterruptedException     e  )     {      e  .  printStackTrace  ();      }      System  .  out  .  println  (  'State after sleeping bookingThread: '     +     bookingThread  .  getState  ());      try     {          // Moves mainThread to waiting state      bookingThread  .  join  ();         }     catch     (  InterruptedException     e  )     {      e  .  printStackTrace  ();      }      System  .  out  .  println  (  'State after bookingThread finishes: '     +     bookingThread  .  getState  ());      }      public     static     void     main  (  String  []     args  )     {      ticketSystem     =     new     TicketSystem  ();      mainThread     =     new     Thread  (  ticketSystem  );      System  .  out  .  println  (  'State after creating mainThread: '     +     mainThread  .  getState  ());      mainThread  .  start  ();      System  .  out  .  println  (  'State after starting mainThread: '     +     mainThread  .  getState  ());      }   }   


Izhod:

Izhod


Pojasnilo:

  • Ko se ustvari nova nit, je ta v stanju NOVO. Ko je v niti poklicana metoda start(), jo razporejevalnik niti premakne v stanje Runnable.
  • Kadarkoli se na primerku niti pokliče metoda join(), gre glavna nit v Čakanje, da se nit rezervacije zaključi.
  • Ko se metoda izvajanja niti zaključi, njeno stanje postane Prekinjeno.
Ustvari kviz