logo

Životní cyklus a stavy vlákna v Javě

A vlákno v Javě může existovat v kterémkoli z následujících stavů v kteroukoli danou chvíli. Vlákno se v každém okamžiku nachází pouze v jednom ze zobrazených stavů:

  1. Nový stát
  2. Runnable State
  3. Blokovaný stav
  4. Čekající stát
  5. Stav načasovaného čekání
  6. Ukončený stát

Níže uvedený diagram představuje různé stavy vlákna v každém okamžiku:

Životní cyklus a stavy vlákna v Javě' title=




Životní cyklus vlákna 

V životním cyklu existuje několik stavů vlákna, jak je uvedeno níže:

  1. Nové vlákno: Když je vytvořeno nové vlákno, je v nový stát . Vlákno se ještě nezačalo spouštět, když je vlákno v tomto stavu. Když vlákno leží v novém stavu, jeho kód se teprve musí spustit a nezačal se provádět.
  2. Runnable State : To je vlákno připraven ke spuštění se přesune do spustitelného stavu. V tomto stavu může být vlákno skutečně spuštěno nebo může být kdykoli připraveno ke spuštění. Je odpovědností plánovače vláken poskytnout vláknu čas na spuštění. Vícevláknový program přiděluje každému jednotlivému vláknu pevné množství času. Každé vlákno má na spuštění malé množství času. Po chvíli běhu se vlákno pozastaví a vzdá CPU, aby mohla běžet jiná vlákna.
  3. Blokováno: Vlákno bude v blokovaném stavu když se snaží získat zámek ale v současné době je zámek získán jiným vláknem. Vlákno se po získání zámku přesune z blokovaného stavu do spustitelného stavu.
  4. Stav čekání : Vlákno bude ve stavu čekání když volá wait() metoda popř připojit se () metoda. Přejde do spustitelného stavu, když jiné vlákno upozorní nebo bude toto vlákno ukončeno.
  5. Časované čekání : Vlákno leží ve stavu časovaného čekání, když to volá metodu s parametrem časového limitu . Vlákno je v tomto stavu, dokud nevyprší časový limit nebo dokud není přijato upozornění. Například když vlákno zavolá režim spánku nebo podmíněné čekání, přesune se do stavu časovaného čekání.
  6. Ukončený stav: Vlákno se ukončí z některého z následujících důvodů: 
    • Protože normálně odchází. K tomu dochází, když byl kód vlákna zcela proveden programem.
    • Protože došlo k nějaké neobvyklé chybné události, jako je chyba segmentace nebo neošetřená výjimka.

Stavy vláken v Javě

V Javě získáte aktuální stav použití vlákna Thread.getState() metoda k získání aktuálního stavu vlákna. Java poskytuje java.lang.Thread.State enum, které definuje konstanty ENUM pro stav vlákna, jehož souhrn je uveden níže: 

1. Nové 

Stav vlákna pro vlákno, které ještě nezačalo. 

řídící struktury python

public static final Thread.State NOVÉ

2. Spustitelný 

Stav vlákna pro spustitelné vlákno. Vlákno ve stavu runnable se spouští na virtuálním stroji Java, ale může čekat na jiné prostředky z operačního systému, jako je procesor. 

římská číslice 1 až 100

public static final Thread.State RUNNABLE

3. Zablokováno 

Stav vlákna pro vlákno zablokované čekající na zámek monitoru. Vlákno v blokovaném stavu čeká, až zámek monitoru vstoupí do synchronizovaného bloku/metody nebo znovu vstoupí do synchronizovaného bloku/metody po volání Object.wait(). 

public static final Thread.State BLOCKED

4. Čekání 

 Stav vlákna pro čekající vlákno. Vlákno je ve stavu čekání kvůli volání jedné z následujících metod: 

  • Object.wait bez časového limitu
  • Thread.join bez časového limitu
  • LockSupport.park

public static final Thread.State WAITING

5. Časované čekání 

Stav vlákna pro čekající vlákno se zadanou dobou čekání. Vlákno je ve stavu časovaného čekání kvůli volání jedné z následujících metod se zadanou kladnou dobou čekání: 

  • Závit.spánek
  • Object.wait s časovým limitem
  • Thread.join s časovým limitem
  • LockSupport.parkNanos
  • LockSupport.parkDokud

veřejné statické konečné vlákno.Stav TIMED_WAITING

6. Ukončeno 

Stav vlákna pro ukončené vlákno. Vlákno bylo dokončeno. 

public static final Thread.State UKONČENO


Příklad demonstrování stavů vláken

Níže je uveden skutečný příklad rezervačního systému vstupenek, který ukazuje různé stavy vláken:

Příklad:

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


jak zrušíte výběr v gimpu

výstup:

Výstup' loading='lazy' title=


Vysvětlení:

  • Když je vytvořeno nové vlákno, vlákno je ve stavu NEW. Když je na vlákně zavolána metoda start(), plánovač vláken ji přesune do stavu Runnable.
  • Kdykoli je na instanci vlákna zavolána metoda join(), hlavní vlákno přejde do Čekání na dokončení vlákna rezervace.
  • Jakmile je metoda běhu vlákna dokončena, její stav se změní na Ukončeno.
Vytvořit kvíz