A kierre Javassa voi olla missä tahansa seuraavista tiloista milloin tahansa. Lanka on vain yhdessä näytetyistä tiloista milloin tahansa:
- Uusi valtio
- Ajettava tila
- Estetty tila
- Odottava valtio
- Ajastettu odotustila
- Päätetty valtio
Alla oleva kaavio esittää säikeen eri tiloja milloin tahansa:

Langan elinkaari
Säikeellä on useita tiloja elinkaaren aikana, kuten alla on mainittu:
- Uusi ketju: Kun uusi säiettä luodaan, se on kohdassa uusi valtio . Säie ei ole vielä alkanut toimia, kun säie on tässä tilassa. Kun säiettä on uudessa tilassa, sen koodia ei ole vielä suoritettu eikä sitä ole aloitettu suorittamaan.
- Ajettava tila : Lanka se on valmis juoksemaan siirretään ajettavaan tilaan. Tässä tilassa säie voi todella olla käynnissä tai se voi olla valmis suoritettavaksi milloin tahansa. Säikeen ajoittajan vastuulla on antaa säikeelle aikaa toimia. Monisäikeinen ohjelma varaa kiinteän ajan jokaiselle yksittäiselle säikeelle. Jokaisella säikeellä on vähän aikaa suorittaa. Käynnissä jonkin aikaa säie pysähtyy ja luovuttaa CPU:n, jotta muut säikeet voivat toimia.
- Estetty: Lanka on estetty kun se yrittää hankkia lukon mutta tällä hetkellä lukon hankkii toinen lanka. Lanka siirtyy estetty-tilasta suoritettavaan tilaan, kun se saa lukituksen.
- Odotustila : Säie on odotustilassa kun se soittaa odota() menetelmä tai liity() menetelmä. Se siirtyy suoritettavaan tilaan, kun toinen säie ilmoittaa tai kyseinen säie lopetetaan.
- Ajastettu odotus : Säie on ajoitetussa odotustilassa, kun se kutsuu menetelmää aikakatkaisuparametrilla . Säie on tässä tilassa, kunnes aikakatkaisu on päättynyt tai kunnes ilmoitus vastaanotetaan. Esimerkiksi kun säie kutsuu nukkumaan tai ehdolliseen odotukseen, se siirretään ajastettuun odotustilaan.
- Päätetty tila: Säie päättyy jommastakummasta seuraavista syistä:
- Koska se poistuu normaalisti. Tämä tapahtuu, kun ohjelma on suorittanut säikeen koodin kokonaan.
- Koska tapahtui jokin epätavallinen virheellinen tapahtuma, kuten segmentointivirhe tai käsittelemätön poikkeus.
Javan säiettätilat
Javassa saadaksesi säikeen käytön nykyisen tilan Thread.getState() menetelmää langan nykyisen tilan selvittämiseksi. Java tarjoaa java.lang.Thread.State enum, joka määrittää säikeen tilan ENUM-vakiot, jonka yhteenveto on annettu alla:
1. Uusi
Säikeen tila säikeelle, joka ei ole vielä alkanut.
lankojen synkronointi
julkinen staattinen lopullinen Thread.State UUSI
2. Ajettavissa
Säikeen tila ajettavalle säikeelle. Ajettavassa tilassa oleva säie suoritetaan Java-virtuaalikoneessa, mutta se saattaa odottaa muita resursseja käyttöjärjestelmästä, kuten prosessoria.
julkinen staattinen lopullinen Thread.State RUNNABLE
3. Estetty
Säikeen tila estetty säikeelle odottamassa näytön lukitusta. Estetyssä tilassa oleva säie odottaa, että näytön lukitus siirtyy synkronoituun lohkoon/menetelmään tai syöttää uudelleen synkronoituun lohkoon/menetelmään kutsun jälkeen Object.wait().
julkinen staattinen lopullinen Thread.State BLOCKED
4. Odotetaan
Säikeen tila odottavalle säikeelle. Säie on odotustilassa, koska se kutsuu jotakin seuraavista menetelmistä:
- Object.wait ilman aikakatkaisua
- Thread.join ilman aikakatkaisua
- LockSupport.park
julkinen staattinen lopullinen Thread.State WAITING
java-ohjelmistomallit
5. Ajastettu odotus
Säikeen tila odottavalle säikeelle, jolla on määritetty odotusaika. Säie on ajastettu odotustilassa, koska se kutsuu jotakin seuraavista menetelmistä määritetyllä positiivisella odotusajalla:
- Thread.sleep
- Object.wait with timeout
- Thread.join with timeout
- LockSupport.parkNanos
- LockSupport.parkUntil
julkinen staattinen lopullinen Thread.State TIMED_WAITING
6. Lopetettu
Säikeen tila päätetylle säikeelle. Lanka on suoritettu loppuun.
julkinen staattinen lopullinen Thread.State LOPETETTU
Esimerkki säikeen tilojen osoittamisesta
Alla on todellinen esimerkki lipunvarausjärjestelmästä, joka näyttää eri säikeen tilat:
Esimerkki:
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()); } }
seleenin perusasiat
Lähtö:
Selitys:
- Kun uusi säiettä luodaan, säiettä on UUSI-tilassa. Kun start()-menetelmää kutsutaan säikeessä, säikeen ajoitus siirtää sen Runnable-tilaan.
- Aina kun join()-menetelmää kutsutaan säikeen ilmentymälle, pääsäie siirtyy kohtaan Odotetaan varaussäikeen valmistumista.
- Kun säikeen ajomenetelmä on valmis, sen tilasta tulee Terminated.