Java valodā pavediens vienmēr pastāv jebkurā no šiem stāvokļiem. Šie stāvokļi ir:
- Jauns
- Aktīvs
- Bloķēts/Gaida
- Noteikta gaidīšana
- 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 .
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.
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.
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ā.
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().