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:
- Nieuwe staat
- Een uitvoerbare staat
- Geblokkeerde staat
- Wachtende staat
- Getimede wachtstatus
- Beëindigde staat
Het onderstaande diagram geeft op elk moment de verschillende statussen van een thread weer:

Levenscyclus van een draad
Er zijn meerdere statussen van de thread in een levenscyclus, zoals hieronder vermeld:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
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.