logo

Langan elinkaari (säikeen tilat)

Javassa säie on aina olemassa missä tahansa seuraavista tiloista. Nämä tilat ovat:

  1. Uusi
  2. Aktiivinen
  3. Estetty / Odottaa
  4. Ajastettu odotus
  5. Lopetettu

Selitys eri säikeen tiloista

Uusi: Aina kun uusi säiettä luodaan, se on aina uudessa tilassa. Uudessa tilassa olevan säikeen koodia ei ole vielä suoritettu, joten se ei ole aloittanut sen suorittamista.

Aktiivinen: Kun säie kutsuu start()-metodin, se siirtyy uudesta tilasta aktiiviseen tilaan. Aktiivinen tila sisältää kaksi tilaa: yksi on ajettavissa , ja toinen on käynnissä .

    Ajettavissa:Säie, joka on valmis suoritettavaksi, siirretään sitten suoritettavaan tilaan. Suoritettavassa tilassa säiettä voi olla käynnissä tai se voi olla valmis suoritettavaksi minä hetkenä tahansa. Säikeen ajoittajan velvollisuus on antaa säikeelle aika suorittaa, eli siirtää säiettä käynnissä olevaan tilaan.
    Monisäikeistystä toteuttava ohjelma hankkii kiinteän osan aikaa kullekin yksittäiselle säikeelle. Jokainen säiettä pyörii lyhyen ajanjakson ajan ja kun varattu aikajakso on ohi, säie luovuttaa vapaaehtoisesti CPU:n toiselle säikeelle, jotta muut säikeet voivat toimia oman aikajaksonsa ajan. Aina kun tällainen skenaario tapahtuu, kaikki ne säikeet, jotka ovat valmiita juoksemaan odottaen vuoroaan, ovat ajettavissa olevassa tilassa. Suoritettavassa tilassa on jono, jossa säikeet sijaitsevat.Juoksu:Kun säiettä saa CPU:n, se siirtyy ajettavasta käynnissä olevaan tilaan. Yleisin säikeen tilan muutos on yleensä suoritettavasta suoritettavaksi ja takaisin suoritettavaksi.

Estetty tai odottaa: Aina kun säie on epäaktiivinen tietyn ajanjakson ajan (ei pysyvästi), säie on joko suljetussa tilassa tai odotustilassa.

Esimerkiksi säie (oletetaan sen nimeksi A) saattaa haluta tulostaa tietoja tulostimesta. Kuitenkin samaan aikaan toinen säie (oletetaan sen nimi on B) käyttää tulostinta tietojen tulostamiseen. Siksi langan A on odotettava, että lanka B käyttää tulostinta. Siten lanka A on estetty. Estetyssä tilassa oleva säie ei pysty suorittamaan mitään suoritusta eikä siten koskaan kuluta mitään keskusyksikön (CPU) jaksoa. Tästä syystä voidaan sanoa, että säie A pysyy käyttämättömänä, kunnes säikeen ajoitus aktivoi uudelleen säikeen A, joka on odotustilassa tai estettynä.

Kun pääsäie kutsuu join()-metodin silloin, sanotaan, että pääsäie on odotustilassa. Pääsäie odottaa sitten, että alasäikeet suorittavat tehtävänsä. Kun alasäikeet suorittavat työnsä, pääsäikeelle lähetetään ilmoitus, joka siirtää säikeen jälleen odottamisesta aktiiviseen tilaan.

Jos odottavassa tai suljetussa tilassa on monta säiettä, säikeen ajoittajan tehtävänä on määrittää, mikä säiettä valitaan ja mikä hylätään, ja valitulle säikeelle annetaan sitten mahdollisuus ajaa.

Ajastettu odotus: Joskus odottaminen johtaa nälkään. Esimerkiksi säiettä (sen nimi on A) on tullut koodin kriittiseen osioon, eikä se ole halukas poistumaan siitä kriittisestä osiosta. Tällaisessa tilanteessa toisen säikeen (sen nimi on B) on odotettava ikuisesti, mikä johtaa nälkään. Tällaisen skenaarion välttämiseksi säikeelle B annetaan ajastettu odotustila. Näin säie on odotustilassa tietyn ajanjakson ajan, ei ikuisesti. Todellinen esimerkki ajoitetusta odottamisesta on, kun kutsumme sleep()-menetelmän tietyssä säikeessä. Sleep()-menetelmä asettaa säikeen ajoitettuun odotustilaan. Kun aika on kulunut loppuun, säie herää ja aloittaa suorittamisen siitä, kun se on lähtenyt aikaisemmin.

Lopetettu: Säie saavuttaa lopetustilan seuraavista syistä:

  • Kun säie on lopettanut työnsä, se on olemassa tai päättyy normaalisti.
  • Epänormaali lopetus:Se tapahtuu, kun epätavallisia tapahtumia, kuten käsittelemätön poikkeus tai segmentointivirhe.

Päätetty säie tarkoittaa, että säiettä ei enää ole järjestelmässä. Toisin sanoen lanka on kuollut, eikä kuollutta lankaa voi millään luoda uudelleen (aktiivinen tappamisen jälkeen).

Seuraavassa kaaviossa näkyy säikeen elinkaaren eri tilat.

Java säikeen elinkaari

Säietilojen toteutus

Javassa säikeen nykyinen tila voidaan saada käyttämällä Thread.getState() menetelmä. The java.lang.Thread.State Java-luokka tarjoaa vakiot ENUM edustamaan säikeen tilaa. Nämä vakiot ovat:

tuple java
 public static final Thread.State NEW 

Se edustaa säikeen ensimmäistä tilaa, joka on UUSI tila.

 public static final Thread.State RUNNABLE 

Se edustaa suoritettavaa tilaa. Se tarkoittaa, että säiettä odottaa jonossa suorittamista.

 public static final Thread.State BLOCKED 

Se edustaa estettyä tilaa. Tässä tilassa lanka odottaa lukon saamista.

 public static final Thread.State WAITING 

Se edustaa odotustilaa. Säie siirtyy tähän tilaan, kun se kutsuu Object.wait()-metodia tai Thread.join()-metodia ilman aikakatkaisua. Odotustilassa oleva säie odottaa toisen säikeen suorittavan tehtävänsä.

 public static final Thread.State TIMED_WAITING 

Se edustaa ajastettua odotustilaa. Suurin ero odottamisen ja ajoitetun odotuksen välillä on aikarajoitus. Odotuksella ei ole aikarajoitusta, kun taas ajoitetulla odotuksella on aikarajoitus. Säie, joka kutsuu seuraavan menetelmän, saavuttaa ajastetun odotustilan.

  • nukkua
  • liity aikakatkaisulla
  • odota aikakatkaisun kanssa
  • puistoon asti
  • parkNanos
 public static final Thread.State TERMINATED 

Se edustaa päättyneen tai kuolleen säikeen lopullista tilaa. Päätetty säie tarkoittaa, että sen suorittaminen on suoritettu loppuun.

Java-ohjelma säietilojen osoittamiseen

Seuraava Java-ohjelma näyttää joitain yllä määritellyn säikeen tiloja.

Tiedoston nimi: ThreadState.java

 // ABC class implements the interface Runnable class ABC implements Runnable { public void run() { // try-catch block try { // moving thread t2 to the state timed waiting Thread.sleep(100); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t1 while it invoked the method join() on thread t2 -'+ ThreadState.t1.getState()); // try-catch block try { Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } } } // ThreadState class implements the interface Runnable public class ThreadState implements Runnable { public static Thread t1; public static ThreadState obj; // main method public static void main(String argvs[]) { // creating an object of the class ThreadState obj = new ThreadState(); t1 = new Thread(obj); // thread t1 is spawned // The thread t1 is currently in the NEW state. System.out.println('The state of thread t1 after spawning it - ' + t1.getState()); // invoking the start() method on // the thread t1 t1.start(); // thread t1 is moved to the Runnable state System.out.println('The state of thread t1 after invoking the method start() on it - ' + t1.getState()); } public void run() { ABC myObj = new ABC(); Thread t2 = new Thread(myObj); // thread t2 is created and is currently in the NEW state. System.out.println('The state of thread t2 after spawning it - '+ t2.getState()); t2.start(); // thread t2 is moved to the runnable state System.out.println('the state of thread t2 after calling the method start() on it - ' + t2.getState()); // try-catch block for the smooth flow of the program try { // moving the thread t1 to the state timed waiting Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 after invoking the method sleep() on it - '+ t2.getState() ); // try-catch block for the smooth flow of the program try { // waiting for thread t2 to complete its execution t2.join(); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 when it has completed it's execution - ' + t2.getState()); } } 

Lähtö:

 The state of thread t1 after spawning it - NEW The state of thread t1 after invoking the method start() on it - RUNNABLE The state of thread t2 after spawning it - NEW the state of thread t2 after calling the method start() on it - RUNNABLE The state of thread t1 while it invoked the method join() on thread t2 -TIMED_WAITING The state of thread t2 after invoking the method sleep() on it - TIMED_WAITING The state of thread t2 when it has completed it's execution - TERMINATED 

Selitys: Aina kun synnytämme uuden säikeen, se saavuttaa uuden tilan. Kun menetelmä start() kutsutaan säikeessä, säikeen ajoitus siirtää kyseisen säikeen suoritettavaan tilaan. Aina kun join()-metodia vedetään missä tahansa säikeen ilmentymässä, tämän käskyn suorittavan nykyisen säikeen on odotettava tämän säikeen suorittamista loppuun, eli siirrettävä säie päätettyyn tilaan. Siksi ennen kuin lopullinen print-lause tulostetaan konsoliin, ohjelma kutsuu menetelmän join() säikeessä t2, jolloin säie t1 odottaa säikeen t2 suorittamisen loppuun ja näin säie t2 päätyy päättyneeseen tai kuolleeseen tilaan. . Säie t1 menee odotustilaan, koska se odottaa säikeen t2 suorittamista loppuun, koska se on kutsunut menetelmän join() säikeessä t2.