Livscykel och tillstånd för en tråd i Java

Livscykel och tillstånd för en tråd i Java

A tråd i Java kan existera i vilket som helst av följande tillstånd vid varje given tidpunkt. En tråd ligger bara i ett av de visade tillstånden vid något ögonblick:

  1. Ny stat
  2. Körbart tillstånd
  3. Blockerad stat
  4. Väntande tillstånd
  5. Tidsatt vänteläge
  6. Avslutad stat

Diagrammet nedan representerar olika tillstånd för en tråd vid varje ögonblick:

Livscykel-och-tillstånd-i-en-tråd-i-Java


En tråds livscykel 

Det finns flera tillstånd i tråden i en livscykel som nämns nedan:

  1. Ny tråd: När en ny tråd skapas ligger den i ny stat . Tråden har ännu inte börjat köras när tråden är i detta tillstånd. När en tråd ligger i det nya tillståndet ska dess kod ännu köras och har inte börjat köras.
  2. Körbart tillstånd : En tråd alltså redo att springa flyttas till ett körbart tillstånd. I detta tillstånd kan en tråd faktiskt köras eller så kan den vara redo att köras när som helst. Det är trådschemaläggarens ansvar att ge tråden tid att köra. Ett flertrådigt program tilldelar en fast tidsperiod till varje enskild tråd. Varje tråd får en liten tid att köra. Efter att ha kört ett tag pausar en tråd och ger upp processorn så att andra trådar kan köras.
  3. Blockerad: Tråden kommer att vara i blockerat tillstånd när den försöker skaffa ett lås men för närvarande förvärvas låset av den andra tråden. Tråden kommer att flytta från det blockerade tillståndet till det körbara tillståndet när den får låset.
  4. Väntande tillstånd : Tråden kommer att vara i vänteläge när den ringer vänta() metod eller ansluta sig till() metod. Den kommer att flyttas till körbart läge när den andra tråden kommer att meddela eller att tråden kommer att avslutas.
  5. Tidsinställd väntar : En tråd ligger i ett tidsbestämt väntande tillstånd när den anropar en metod med en timeout-parameter . En tråd ligger i detta tillstånd tills timeouten är klar eller tills ett meddelande tas emot. Till exempel när en tråd anropar viloläge eller en villkorlig väntan flyttas den till ett tidsbestämt vänteläge.
  6. Avslutat tillstånd: En tråd avslutas på grund av något av följande skäl: 
    • Eftersom det går ut normalt. Detta händer när koden för tråden har körts helt av programmet.
    • Eftersom det inträffade någon ovanlig felaktig händelse, som ett segmenteringsfel eller ett ohanterat undantag.

Trådtillstånd i Java

I Java för att få aktuell status för tråden använd Thread.getState() metod för att få det aktuella tillståndet för tråden. Java ger java.lang.Thread.State enum som definierar ENUM-konstanterna för tillståndet för en tråd som en sammanfattning av detta ges nedan: 

1. Nytt 

Trådstatus för en tråd som ännu inte har startat. 

offentlig statisk slutlig Thread.State NY

2. Körbar 

Trådtillstånd för en löpbar tråd. En tråd i körbart tillstånd körs i den virtuella Java-maskinen men den kan vänta på andra resurser från operativsystemet, till exempel en processor. 

offentlig statisk slutlig tråd. Tillstånd KÖRBAR

3. Blockerad 

Trådtillstånd för en tråd blockerad som väntar på ett monitorlås. En tråd i blockerat tillstånd väntar på att ett monitorlås ska gå in i ett synkroniserat block/metod eller återgå till ett synkroniserat block/metod efter att ha anropat Object.wait(). 

offentlig statisk slutlig tråd.Tillstånd BLOCKERAD

4. Väntar 

 Trådstatus för en väntande tråd. En tråd är i vänteläge på grund av anrop av någon av följande metoder: 

  • Object.wait utan timeout
  • Tråd.gå med utan timeout
  • LockSupport.park

offentlig statisk slutlig Tråd.State VÄNTAR

5. Tidsinställd väntan 

Trådstatus för en väntande tråd med angiven väntetid. En tråd är i det tidsinställda vänteläget på grund av att en av följande metoder anropas med en angiven positiv väntetid: 

  • Tråd.sömn
  • Object.wait med timeout
  • Tråd.gå med med timeout
  • LockSupport.parkNanos
  • LockSupport.parkUntil

offentlig statisk slutlig tråd. Tillstånd TIMED_WAITING

6. Avslutad 

Trådtillstånd för en avslutad tråd. Tråden har slutfört exekvering. 

offentlig statisk slutlig tråd.Tillstånd AVSLUTAD


Exempel på att demonstrera trådtillstånd

Nedan är ett verkligt exempel på ett biljettbokningssystem som visar olika trådtillstånd:

Exempel:

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  ());      }   }   


Produktion:

Produktion


Förklaring:

  • När en ny tråd skapas är tråden i NYTT tillstånd. När start()-metoden anropas på en tråd flyttar trådschemaläggaren den till tillståndet Runnable.
  • Närhelst join()-metoden anropas på en trådinstans går huvudtråden till Väntar på att bokningstråden ska slutföras.
  • När trådens körningsmetod har slutförts blir dess tillstånd avslutad.
Skapa frågesport