logo

Cykl życia i stany wątku w Javie

A nitka w Javie może w dowolnym momencie znajdować się w dowolnym z poniższych stanów. Wątek w danym momencie znajduje się tylko w jednym z pokazanych stanów:

  1. Nowe państwo
  2. Stan możliwy do uruchomienia
  3. Stan zablokowany
  4. Stan oczekiwania
  5. Czasowy stan oczekiwania
  6. Stan zakończony

Poniższy diagram przedstawia różne stany wątku w dowolnym momencie:

Cykl życia i stany wątku w Javie' title=




Cykl życia wątku 

Istnieje wiele stanów wątku w cyklu życia, jak wspomniano poniżej:

  1. Nowy wątek: Kiedy tworzony jest nowy wątek, znajduje się on w pliku nowy stan . Wątek nie został jeszcze uruchomiony, gdy jest w tym stanie. Kiedy wątek znajduje się w nowym stanie, jego kod nie został jeszcze uruchomiony i nie zaczął się wykonywać.
  2. Stan możliwy do uruchomienia : To znaczy gotowy do biegu zostaje przeniesiony do stanu nadającego się do uruchomienia. W tym stanie wątek może faktycznie działać lub może być gotowy do działania w dowolnym momencie. Za zapewnienie wątkowi czasu na działanie odpowiada planista wątku. Program wielowątkowy przydziela stałą ilość czasu każdemu pojedynczemu wątkowi. Każdy wątek ma określoną ilość czasu na wykonanie. Po pewnym czasie wątek zatrzymuje się i oddaje procesor, aby inne wątki mogły działać.
  3. Zablokowany: Wątek będzie w stanie zablokowanym gdy próbuje uzyskać zamek ale obecnie blokada jest przejmowana przez inny wątek. Wątek przejdzie ze stanu zablokowanego do stanu umożliwiającego wykonanie, gdy uzyska blokadę.
  4. Stan oczekiwania : Wątek będzie w stanie oczekiwania kiedy wywołuje oczekiwanie() metoda lub dołączyć() metoda. Przejdzie do stanu umożliwiającego wykonanie, gdy inny wątek powiadomi lub wątek zostanie zakończony.
  5. Czasowe oczekiwanie : Wątek znajduje się w stanie oczekiwania, gdy jest wywołuje metodę z parametrem limitu czasu . Wątek pozostaje w tym stanie do momentu upływu limitu czasu lub otrzymania powiadomienia. Na przykład, gdy wątek wywołuje stan uśpienia lub oczekiwania warunkowego, zostaje przeniesiony do stanu oczekiwania czasowego.
  6. Stan zakończony: Wątek kończy się z jednego z następujących powodów: 
    • Bo normalnie się wyłącza. Dzieje się tak, gdy kod wątku został w całości wykonany przez program.
    • Ponieważ wystąpiło nietypowe, błędne zdarzenie, takie jak błąd segmentacji lub nieobsługiwany wyjątek.

Stany wątków w Javie

W Javie, aby uzyskać bieżący stan użycia wątku Wątek.getState() metoda uzyskania bieżącego stanu wątku. Java zapewnia java.lang.Thread.State enum, który definiuje stałe ENUM dla stanu wątku, którego podsumowanie podano poniżej: 

1. Nowy 

Stan wątku dla wątku, który jeszcze się nie rozpoczął. 

jak wyłuskać wskaźnik w c

public static final Thread.State NOWOŚĆ

2. Uruchomiony 

Stan wątku dla wątku, który można uruchomić. Wątek w stanie umożliwiającym wykonanie jest wykonywany na wirtualnej maszynie Java, ale może czekać na inne zasoby systemu operacyjnego, takie jak procesor. 

public static final Thread.State RUNNABLE

3. Zablokowany 

Stan wątku dla wątku zablokowanego w oczekiwaniu na blokadę monitora. Wątek w stanie zablokowanym oczekuje, aż blokada monitora wejdzie do zsynchronizowanego bloku/metody lub ponownie wejdzie do zsynchronizowanego bloku/metody po wywołaniu Obiekt.wait(). 

publiczny statyczny końcowy wątek. Stan ZABLOKOWANY

4. Oczekiwanie 

 Stan wątku oczekującego wątku. Wątek znajduje się w stanie oczekiwania z powodu wywołania jednej z następujących metod: 

  • Obiekt.wait bez limitu czasu
  • Wątek.dołącz bez limitu czasu
  • LockSupport.park

publiczny statyczny końcowy Wątek. Stan OCZEKIWANIE

5. Oczekiwanie w określonym czasie 

Stan wątku oczekującego wątku z określonym czasem oczekiwania. Wątek znajduje się w stanie oczekiwania z powodu wywołania jednej z poniższych metod z określonym dodatnim czasem oczekiwania: 

  • Wątek.sen
  • Obiekt.wait z przekroczeniem limitu czasu
  • Thread.join z przekroczeniem limitu czasu
  • LockSupport.parkNanos
  • ZablokujSupport.parkDo

publiczny statyczny końcowy wątek. Stan TIMED_WAITING

eksploracja danych

6. Zakończony 

Stan wątku dla zakończonego wątku. Wątek zakończył wykonywanie. 

publiczny statyczny końcowy wątek. Stan ZAKOŃCZONY


Przykład demonstracji stanów wątków

Poniżej znajduje się rzeczywisty przykład systemu rezerwacji biletów, który demonstruje różne stany wątków:

Przykład:

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


moduły sprężynowe

Wyjście:

Wyjście' loading='lazy' title=


Wyjaśnienie:

  • Kiedy tworzony jest nowy wątek, jest on w stanie NOWY. Gdy w wątku zostanie wywołana metoda start(), program planujący wątek przenosi ją do stanu Runnable.
  • Za każdym razem, gdy wywoływana jest metoda Join() w instancji wątku, główny wątek przechodzi do stanu Oczekiwanie na zakończenie wątku rezerwacji.
  • Po zakończeniu metody uruchamiania wątku jej stan zostaje Zakończony.
Utwórz quiz