logo

Levenscyclus en toestanden van een thread in Java

A draad in Java kan op elk moment in een van de volgende toestanden voorkomen. Een draad bevindt zich op elk moment slechts in een van de weergegeven toestanden:

  1. Nieuwe staat
  2. Een uitvoerbare staat
  3. Geblokkeerde staat
  4. Wachtende staat
  5. Getimede wachtstatus
  6. Beëindigde staat

Het onderstaande diagram geeft op elk moment de verschillende statussen van een thread weer:

Levenscyclus-en-statussen-van-een-thread-in-Java' title=




Levenscyclus van een draad 

Er zijn meerdere statussen van de thread in een levenscyclus, zoals hieronder vermeld:

  1. Nieuwe draad: Wanneer er een nieuwe thread wordt aangemaakt, bevindt deze zich in de nieuwe staat . De thread is nog niet gestart als de thread zich in deze status bevindt. Wanneer een thread zich in de nieuwe staat bevindt, moet de code nog worden uitgevoerd en is de uitvoering ervan nog niet begonnen.
  2. Een uitvoerbare staat : Een draad dus klaar om te rennen wordt verplaatst naar een uitvoerbare staat. In deze status is het mogelijk dat een thread daadwerkelijk actief is, of dat deze op elk moment gereed kan zijn om te worden uitgevoerd. Het is de verantwoordelijkheid van de threadplanner om de thread de tijd te geven om te worden uitgevoerd. Een programma met meerdere threads wijst een vaste hoeveelheid tijd toe aan elke afzonderlijke thread. Elke thread krijgt een kleine hoeveelheid tijd om te worden uitgevoerd. Na een tijdje actief te zijn geweest, pauzeert een thread en geeft de CPU op, zodat andere threads kunnen worden uitgevoerd.
  3. Geblokkeerd: De thread bevindt zich in de geblokkeerde status wanneer het probeert een slot te bemachtigen maar momenteel wordt het slot overgenomen door de andere thread. De thread gaat van de geblokkeerde status naar de uitvoerbare status wanneer deze de vergrendeling verkrijgt.
  4. Wachtende staat : De thread bevindt zich in de wachtstatus wanneer het wait() aanroept methode of meedoen() methode. Het zal naar de uitvoerbare status gaan wanneer een andere thread hiervan op de hoogte wordt gesteld of die thread wordt beëindigd.
  5. Getimed wachten : Een thread bevindt zich in een getimede wachtstatus wanneer deze wordt uitgevoerd roept een methode aan met een time-outparameter . Een thread blijft in deze status totdat de time-out is voltooid of totdat er een melding wordt ontvangen. Wanneer een thread bijvoorbeeld slaap of voorwaardelijk wachten aanroept, wordt deze verplaatst naar een getimede wachtstatus.
  6. Beëindigde staat: Een thread wordt beëindigd vanwege een van de volgende redenen: 
    • Omdat het normaal weggaat. Dit gebeurt wanneer de code van de thread volledig door het programma is uitgevoerd.
    • Omdat er een ongebruikelijke foutieve gebeurtenis heeft plaatsgevonden, zoals een segmentatiefout of een onverwerkte uitzondering.

Thread-statussen op Java

In Java wordt de huidige status van de thread gebruikt Thread.getState() methode om de huidige status van de thread te verkrijgen. Java biedt java.lang.Thread.State enum dat de ENUM-constanten voor de status van een thread definieert, waarvan hieronder een samenvatting wordt gegeven: 

1. Nieuw 

Threadstatus voor een thread die nog niet is gestart. 

mvc java

public static final Thread.State NIEUW

2. Uitvoerbaar 

Threadstatus voor een uitvoerbare thread. Een thread in de uitvoerbare status wordt uitgevoerd op de virtuele Java-machine, maar wacht mogelijk op andere bronnen van het besturingssysteem, zoals een processor. 

openbare statische finale Thread.State RUNNABLE

3. Geblokkeerd 

Threadstatus voor een thread die is geblokkeerd terwijl er wordt gewacht op een monitorvergrendeling. Een thread in de geblokkeerde status wacht op een monitorvergrendeling om een ​​gesynchroniseerd blok/methode binnen te gaan of opnieuw een gesynchroniseerd blok/methode binnen te gaan na het aanroepen Object.wacht(). 

openbare statische finale Thread.State GEBLOKKEERD

4. Wachten 

 Threadstatus voor een wachtende thread. Een thread bevindt zich in de wachtstatus vanwege het aanroepen van een van de volgende methoden: 

  • Object.wait zonder time-out
  • Onderwerp.join zonder time-out
  • LockSupport.park

openbare statische finale Thread.State WACHTEN

5. Getimed wachten 

Threadstatus voor een wachtende thread met een opgegeven wachttijd. Een thread bevindt zich in de getimede wachtstatus vanwege het aanroepen van een van de volgende methoden met een opgegeven positieve wachttijd: 

  • Draad.slaap
  • Object.wait met time-out
  • Thread.join met time-out
  • LockSupport.parkNanos
  • LockSupport.parkTot

openbare statische laatste Thread.State TIMED_WAITING

mb naar gb

6. Beëindigd 

Threadstatus voor een beëindigde thread. De uitvoering van de thread is voltooid. 

public static final Thread.State BEËINDIGD


Voorbeeld van het demonstreren van threadstatussen

Hieronder ziet u een praktijkvoorbeeld van een ticketboekingssysteem dat verschillende threadstatussen demonstreert:

Voorbeeld:

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


Java-tekenreeks in array

Uitgang:

Uitvoer' loading='lazy' title=


Uitleg:

  • Wanneer een nieuwe thread wordt aangemaakt, heeft de thread de status NIEUW. Wanneer de methode start() voor een thread wordt aangeroepen, verplaatst de threadplanner deze naar de status Uitvoerbaar.
  • Telkens wanneer de methode join() wordt aangeroepen op een threadinstantie, gaat de hoofdthread naar Wachten tot de boekingsthread is voltooid.
  • Zodra de run-methode van de thread is voltooid, wordt de status Beëindigd.
Quiz maken