logo

Pavediena dzīves cikls (pavedienu stāvokļi)

Java valodā pavediens vienmēr pastāv jebkurā no šiem stāvokļiem. Šie stāvokļi ir:

  1. Jauns
  2. Aktīvs
  3. Bloķēts/Gaida
  4. Noteikta gaidīšana
  5. Izbeigts

Dažādu pavedienu stāvokļu skaidrojums

Jaunums: Ikreiz, kad tiek izveidots jauns pavediens, tas vienmēr ir jaunā stāvoklī. Jaunā stāvoklī esošajam pavedienam kods vēl nav palaists un tāpēc nav sācis tā izpildi.

Aktīvs: Kad pavediens izsauc start() metodi, tas pāriet no jaunā stāvokļa uz aktīvo stāvokli. Aktīvajā stāvoklī ir divi stāvokļi: viens ir skrienams , un otrs ir skrienot .

    Darbināms:Pavediens, kas ir gatavs palaišanai, tiek pārvietots uz palaišanas stāvokli. Darbināmā stāvoklī pavediens var darboties vai būt gatavs darbam jebkurā noteiktā laika momentā. Pavedienu plānotāja pienākums ir nodrošināt pavediena palaišanas laiku, t.i., virzīt pavedienu darbības stāvoklī.
    Programma, kas ievieš daudzpavedienu izveidošanu, katram atsevišķam pavedienam iegūst noteiktu laika daļu. Katrs pavediens darbojas īsu laika posmu, un, kad šī atvēlētā laika daļa ir beigusies, pavediens brīvprātīgi atdod CPU otram pavedienam, lai arī citi pavedieni varētu darboties savu laika daļu. Ikreiz, kad notiek šāds scenārijs, visi tie pavedieni, kas ir gatavi darboties, gaidot savu kārtu, atrodas darbināmā stāvoklī. Darbināmā stāvoklī ir rinda, kur atrodas pavedieni.Skriešana:Kad pavediens saņem centrālo procesoru, tas pāriet no palaišanas stāvokļa uz darbības stāvokli. Parasti visizplatītākās pavediena stāvokļa izmaiņas ir no izpildāma uz palaišanu un atkal uz palaišanu.

Bloķēts vai gaida: Ikreiz, kad pavediens kādu laiku ir neaktīvs (ne pastāvīgi), pavediens ir bloķētā stāvoklī vai gaidīšanas stāvoklī.

Piemēram, pavediens (pieņemsim, ka tā nosaukums ir A) var vēlēties izdrukāt dažus datus no printera. Tomēr tajā pašā laikā otrs pavediens (pieņemsim, ka tā nosaukums ir B) izmanto printeri, lai drukātu dažus datus. Tāpēc pavedienam A ir jāgaida, līdz pavediens B var izmantot printeri. Tādējādi pavediens A atrodas bloķētā stāvoklī. Bloķētā stāvoklī esošs pavediens nevar veikt nekādu izpildi un tādējādi nekad nepatērē nevienu centrālā procesora bloka (CPU) ciklu. Tādējādi mēs varam teikt, ka pavediens A paliek dīkstāvē, līdz pavedienu plānotājs atkārtoti aktivizē pavedienu A, kas atrodas gaidīšanas vai bloķēšanas stāvoklī.

Kad galvenais pavediens izsauc join() metodi, tiek teikts, ka galvenais pavediens atrodas gaidīšanas stāvoklī. Pēc tam galvenais pavediens gaida, kamēr bērnu pavedieni pabeigs savus uzdevumus. Kad pakārtotie pavedieni pabeidz savu darbu, uz galveno pavedienu tiek nosūtīts paziņojums, kas atkal pārvieto pavedienu no gaidīšanas uz aktīvo stāvokli.

Ja gaidīšanas vai bloķēšanas stāvoklī ir daudz pavedienu, tad pavedienu plānotāja pienākums ir noteikt, kuru pavedienu izvēlēties un kuru noraidīt, un pēc tam izvēlētajam pavedienam tiek dota iespēja palaist.

Noteikta gaidīšana: Dažreiz gaidīšana noved pie bada. Piemēram, pavediens (tā nosaukums ir A) ir iekļuvis koda kritiskajā sadaļā un nevēlas atstāt šo kritisko sadaļu. Šādā scenārijā citam pavedienam (tā nosaukums ir B) ir jāgaida mūžīgi, kas noved pie bada. Lai izvairītos no šāda scenārija, pavedienam B tiek piešķirts laika gaidīšanas stāvoklis. Tādējādi pavediens atrodas gaidīšanas stāvoklī noteiktu laika posmu, nevis uz visiem laikiem. Īsts laiks gaidīšanas piemērs ir tad, kad mēs izsaucam miega () metodi noteiktā pavedienā. Sleep() metode ievieto pavedienu noteiktā gaidīšanas stāvoklī. Kad laiks beidzas, pavediens pamostas un sāk tā izpildi no brīža, kad tas ir aizgājis agrāk.

Izbeigts: Pavediens sasniedz beigu stāvokli šādu iemeslu dēļ:

  • Kad pavediens ir pabeidzis savu darbu, tas pastāv vai beidzas normāli.
  • Nenormāla izbeigšana:Tas notiek dažu neparastu notikumu, piemēram, neapstrādāta izņēmuma vai segmentācijas kļūmes gadījumā.

Pārtraukts pavediens nozīmē, ka pavediena vairs nav sistēmā. Citiem vārdiem sakot, pavediens ir miris, un nav iespējams atjaunot mirušo pavedienu (aktīvs pēc nogalināšanas).

Nākamajā diagrammā parādīti dažādi stāvokļi, kas iesaistīti pavediena dzīves ciklā.

Java pavedienu dzīves cikls

Diegu stāvokļu ieviešana

Java programmā pavediena pašreizējo stāvokli var iegūt, izmantojot Thread.getState() metodi. The java.lang.Thread.State Java klase nodrošina konstantes ENUM, lai attēlotu pavediena stāvokli. Šīs konstantes ir:

localdate java
 public static final Thread.State NEW 

Tas attēlo pavediena pirmo stāvokli, kas ir JAUNS stāvoklis.

 public static final Thread.State RUNNABLE 

Tas apzīmē izpildāmo stāvokli. Tas nozīmē, ka pavediens gaida rindā, lai palaistu.

 public static final Thread.State BLOCKED 

Tas apzīmē bloķēto stāvokli. Šajā stāvoklī pavediens gaida, lai iegūtu slēdzeni.

 public static final Thread.State WAITING 

Tas attēlo gaidīšanas stāvokli. Pavediens nonāks šajā stāvoklī, kad tas izsauc metodi Object.wait() vai metodi Thread.join() bez taimauta. Pavediens gaidīšanas stāvoklī gaida, kad cits pavediens pabeigs savu uzdevumu.

 public static final Thread.State TIMED_WAITING 

Tas apzīmē noteikta laika gaidīšanas stāvokli. Galvenā atšķirība starp gaidīšanu un noteikta laika gaidīšanu ir laika ierobežojums. Gaidīšanai nav laika ierobežojumu, savukārt noteiktai gaidīšanai ir laika ierobežojums. Pavediens, kas izsauc šādu metodi, sasniedz noteikta laika gaidīšanas stāvokli.

  • Gulēt
  • pievienoties ar taimautu
  • pagaidiet ar taimautu
  • parksLīdz
  • parkNanos
 public static final Thread.State TERMINATED 

Tas attēlo pavediena beigu stāvokli, kas ir pārtraukts vai miris. Pārtraukts pavediens nozīmē, ka tā izpilde ir pabeigta.

Java programma pavedienu stāvokļu demonstrēšanai

Šī Java programma parāda dažus iepriekš definētā pavediena stāvokļus.

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

Izvade:

 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 

Paskaidrojums: Ikreiz, kad mēs izveidojam jaunu pavedienu, šis pavediens sasniedz jauno stāvokli. Kad pavedienā tiek izsaukta metode start(), pavedienu plānotājs pārvieto šo pavedienu uz palaišanas stāvokli. Ikreiz, kad jebkurā pavediena instancē tiek izsaukta metode join(), pašreizējam pavedienam, kas izpilda šo paziņojumu, ir jāgaida, līdz šis pavediens pabeigs tā izpildi, t.i., šis pavediens ir jāpārvieto uz pārtraukto stāvokli. Tāpēc, pirms konsolē tiek izdrukāts galīgais drukāšanas priekšraksts, programma izsauc metodi join() pavedienā t2, liekot pavedienam t1 gaidīt, kamēr pavediens t2 pabeidz izpildi, un tādējādi pavediens t2 nonāk pārtrauktā vai mirušā stāvoklī. . Pavediens t1 pāriet uz gaidīšanas stāvokli, jo tas gaida, līdz pavediens t2 pabeigs tā izpildi, jo pavedienā t2 ir izsaukusi metodi join().