Bet kuri programa gali turėti kelis procesus (egzempliorius). Kiekvieną iš šių procesų galima priskirti kaip vieną giją arba kelias gijas. Šioje pamokoje pamatysime, kaip vienu metu atlikti kelias užduotis, taip pat sužinoti daugiau apie gijas ir sinchronizavimą tarp gijų.
Šioje pamokoje sužinosime:
- Kas yra viena gija
- Kas yra „Java“ daugialypis gija?
- Gijos gyvavimo ciklas „Java“
- „Java“ gijų sinchronizavimas
- „Java“ daugiagijis pavyzdys
Kas yra viena gija?
Vienas siūlas iš esmės yra lengvas ir mažiausias apdorojimo vienetas. „Java“ naudoja gijas naudodama „Siūlų klasę“.
Yra dviejų tipų gijos - vartotojo gijos ir „daemon“ gijos („daemon“ gijos yra naudojamos, kai norime išvalyti programą, ir yra naudojamos fone).
Pirmą kartą paleidus programą, sukuriama vartotojo gija. Paskelbkite tai, kad galime sukurti daug vartotojų ir „deemon“ gijų.
Vienos gijos pavyzdys:
paketo demotest;viešoji klasė „GuruThread“{public static void main (String [] argumentuoja) {System.out.println („viena gija“);}}
Vieno sriegio privalumai:
- Sumažina pridėtines išlaidas programoje, kai sistemoje vykdoma viena gija
- Be to, tai sumažina programos priežiūros išlaidas.
Kas yra „Java“ daugialypis gija?
MULTITHREADING „Java“ yra dviejų ar daugiau gijų vykdymo procesas vienu metu, kad maksimaliai išnaudotų procesorių. Daugelio gijų programos vykdo dvi ar daugiau gijų, vykdomų vienu metu. Taigi, jis taip pat žinomas kaip „Java“ lygiagretumas. Kiekvienas siūlas eina lygiagrečiai vienas kitam. Daugybinės gijos nepriskiria atskiros atminties srities, taigi jos taupo atmintį. Be to, konteksto perjungimas tarp gijų užima mažiau laiko.
Kelių gijų pavyzdys:
paketo demotest;viešosios klasės „GuruThread1“ įgyvendina „Runnable“{public static void main (String [] argumentuoja) {Gijos guruThread1 = nauja gija ("Guru1");Gijos guruThread2 = nauja gija ("Guru2");guruThread1.start ();guruThread2.start ();System.out.println ("Gijų pavadinimai yra tokie:");System.out.println (guruThread1.getName ());System.out.println (guruThread2.getName ());}@ Nepaisytipublic void run () {}}
Daugiasluoksnių siūlų privalumai:
- Vartotojai nėra užblokuoti, nes gijos yra nepriklausomos, todėl kartais galime atlikti kelias operacijas
- Kadangi tokios gijos yra nepriklausomos, kitos gijos nebus paveiktos, jei viena gija atitinka išimtį.
Gijos gyvavimo ciklas „Java“
Gijos gyvavimo ciklas:
Yra įvairūs siūlų gyvavimo ciklo etapai, kaip parodyta aukščiau pateiktoje diagramoje:
- Nauja
- Bėgama
- Bėgimas
- Laukimas
- Miręs
- Nauja: Šiame etape gija sukuriama naudojant klasę „Siūlų klasė“. Ši būsena lieka tol, kol programa paleidžia giją. Jis taip pat žinomas kaip gimęs siūlas.
- Paleidžiama: Šiame puslapyje gijos egzempliorius iškviečiamas paleidimo metodu. Gijos valdymas suteikiamas planuotojui, kad užbaigtų vykdymą. Nuo planuotojo priklauso, ar paleisti giją.
- Vykdoma: kai gija pradeda vykdyti, būsena pakeičiama į „veikia“ būseną. Planuotojas pasirenka vieną giją iš gijų telkinio ir jis pradedamas vykdyti programoje.
- Laukimas: tai būsena, kai gija turi laukti. Kadangi programoje veikia kelios gijos, reikia sinchronizuoti gijas. Taigi, viena gija turi laukti, kol bus vykdoma kita gija. Todėl ši būsena vadinama laukimo būsena.
- Negyvas: tai būsena, kai gija nutraukiama. Gija yra veikiančioje būsenoje ir kai tik ji baigiama apdoroti, ji yra „negyva“.
Kai kurie dažniausiai naudojami gijų metodai yra šie:
Metodas | apibūdinimas |
---|---|
pradžia () | Šis metodas pradeda vykdyti giją ir JVM iškviečia run () metodą gijoje. |
Miego režimas (milisekundėmis) | Šis metodas priverčia giją miegoti, todėl gijos vykdymas pristabdomas numatytomis milisekundėmis, o po to vėl gija pradeda vykdyti. Tai padės sinchronizuoti gijas. |
getName () | Jis grąžina gijos pavadinimą. |
setPriority (int newpriority) | Tai keičia gijos prioritetą. |
derlius () | Tai sukelia dabartinių gijų sustabdymą ir kitų gijų vykdymą. |
Pavyzdys: Šiame pavyzdyje mes sukursime giją ir ištirsime įmontuotus gijų metodus.
paketo demotest;public class thread_example1 įgyvendina „Runnable“@ Nepaisytipublic void run () {}public static void main (String [] argumentuoja) {Gijos guruthread1 = nauja gija ();guruthread1.start ();bandyti {guruthread1.sleep (1000);} sugavimas („InterruptedException e“) {// TODO Automatiškai sugeneruotas blokavimo blokase.printStackTrace ();}guruthread1.setPriority (1);int gurupriority = guruthread1.getPriority ();System.out.println (nesąžiningumas);System.out.println („Vykdomas sriegis“);}}
Kodo paaiškinimas:
- 2 kodo eilutė: Mes kuriame klasę „thread_Example1“, kuri įgyvendina „Runnable“ sąsają (ją turėtų įdiegti bet kuri klasė, kurios egzempliorius ketina vykdyti gija.)
- 4 kodo eilutė: ji pakeičia paleidžiamos sąsajos paleidimo metodą, nes privaloma nepaisyti to metodo
- Kodo eilutė 6: Čia mes apibrėžėme pagrindinį metodą, kuriuo pradėsime gijos vykdymą.
- 7 kodo eilutė: Čia mes kuriame naują gijos pavadinimą „guruthread1“, supaprastindami naują gijų klasę.
- 8 kodo eilutė: naudosime gijos „pradžios“ metodą naudodami „guruthread1“ egzempliorių. Čia gija bus pradėta vykdyti.
- 10 kodo eilutė: Čia naudojame gijos „miego“ metodą, naudodami egzempliorių „guruthread1“. Vadinasi, siūlas miegos 1000 milisekundžių.
- Kodas 9-14: Čia mes įdėjome miego metodą į bandymo sugavimo bloką, nes yra pažymėta išimtis, kuri įvyksta, ty pertraukta išimtis.
- 15 kodo eilutė: Čia mes nustatome gijos prioritetą 1 nuo to, koks jis buvo
- Kodo 16 eilutė: Čia mes gauname gijos prioritetą naudodami „getPriority“ ()
- 17 kodo eilutė: Čia spausdiname vertę, gautą iš „getPriority“
- 18 kodo eilutė: Čia mes rašome tekstą, kurį veikia gija.
Vykdydami pirmiau nurodytą kodą gausite šį išvestį:
Išvestis:
5 yra „Thread“ prioritetas, o „Thread Running“ yra tekstas, kuris yra mūsų kodo išvestis.
„Java“ gijų sinchronizavimas
Keliose gijimo programose yra asinchroninis programų elgesys. Jei viena gija rašo kai kuriuos duomenis, o kita gija, skaitanti duomenis tuo pačiu metu, programoje gali atsirasti nenuoseklumas.
Kai reikia prieiti prie bendrų išteklių dviem ar daugiau gijų, naudojamas sinchronizavimo metodas.
„Java“ pateikė sinchronizuotus metodus sinchronizuotam elgesiui įgyvendinti.
Taikant šį metodą, kai gija pasiekia sinchronizuoto bloko vidų, tada jokia kita gija negali iškviesti to metodo tame pačiame objekte. Visos gijos turi laukti, kol ta gija baigs sinchronizuotą bloką ir išeis iš to.
Tokiu būdu sinchronizavimas padeda daugialypei programai. Viena gija turi laukti, kol kita gija baigs vykdyti tik tada kitas gijas leidžiama vykdyti.
Tai gali būti parašyta tokia forma:
Sinchronizuotas (objektas){// Sinchronizuojamų teiginių blokas}
„Java“ daugiagijis pavyzdys
Šiame pavyzdyje paimsime dvi gijas ir paimsime gijų pavadinimus.
1 pavyzdys:
GuruThread1.javapaketo demotest;viešosios klasės „GuruThread1“ įgyvendina „Runnable“/ *** @param argumentuoja* /public static void main (String [] argumentuoja) {Gijos guruThread1 = nauja gija ("Guru1");Gijos guruThread2 = nauja gija ("Guru2");guruThread1.start ();guruThread2.start ();System.out.println ("Gijų pavadinimai yra tokie:");System.out.println (guruThread1.getName ());System.out.println (guruThread2.getName ());}@ Nepaisytipublic void run () {}}
Kodo paaiškinimas:
- 3 kodo eilutė: Mes pasirinkome „GuruThread1“ klasę, kuri įgyvendina „Runnable“ (ją turėtų įdiegti bet kuri klasė, kurios egzempliorius ketina vykdyti gija.)
- 8 kodo eilutė: tai yra pagrindinis klasės metodas
- 9 kodo eilutė: Čia mes išaiškiname „Thread“ klasę ir sukuriame egzempliorių, pavadintą „guruThread1“, ir sukursime giją.
- 10 kodo eilutė: Čia mes išaiškiname „Thread“ klasę ir sukuriame egzempliorių, pavadintą „guruThread2“, ir sukursime giją.
- Kodo 11 eilutė: Mes pradedame giją, ty guruThread1.
- 12 kodo eilutė: pradedame giją, ty „guruThread2“.
- Kodo eilutė 13: tekstas išvestas taip: „Gijų pavadinimai yra tokie:“
- 14 kodo eilutė: 1 gijos pavadinimo gavimas naudojant gijų klasės metodą getName ().
- 15 kodo eilutė: 2 gijos pavadinimo gavimas naudojant gijų klasės metodą getName ().
Vykdydami pirmiau nurodytą kodą gausite šį išvestį:
Išvestis:
Siūlų pavadinimai čia pateikiami kaip
- Guru1
- Guru2
2 pavyzdys:
Šiame pavyzdyje sužinosime apie paleidžiamos sąsajos svarbiausius metodus run () ir start () ir sukursime dvi tos klasės gijas ir jas atitinkamai paleisime.
Be to, mes lankome dvi klases,
- Tas, kuris įdiegs veikiamą sąsają ir
- Kitas, turintis pagrindinį metodą ir atitinkamai vykdomas.
paketo demotest;viešoji klasė „GuruThread2“ {public static void main (String [] argumentuoja) {// TODO Automatiškai sugeneruotas metodasGuruThread3 threadguru1 = naujas GuruThread3 ("guru1");threadguru1.start ();GuruThread3 threadguru2 = naujas GuruThread3 ("guru2");threadguru2.start ();}}klasės „GuruThread3“ įgyvendina „Runnable“Gijų guruthread;privati styginių guruname;„GuruThread3“ (eilutės pavadinimas) {guruname = vardas;}@ Nepaisytipublic void run () {System.out.println („Vyksta gija“ + guruname);už (int i = 0; i <4; i ++) {System.out.println (i);System.out.println (guruname);bandyti {Siūlas.miega (1000);} sugavimas („InterruptedException e“) {System.out.println ("Gija nutraukta");}}}vieša niekinė pradžia () {System.out.println ("Gija pradėta");jei (guruthread == null) {guruthread = nauja gija (tai, guruname);guruthread.start ();}}}
Kodo paaiškinimas:
- 2 kodo eilutė: Čia mes pasirenkame klasę „GuruThread2“, kurioje bus pagrindinis metodas.
- 4 kodo eilutė: Čia mes naudojame pagrindinį klasės metodą.
- Kodo eilutė 6-7: Čia mes kuriame klasės „GuruThread3“ egzempliorių (kuris sukurtas žemiau esančiose kodo eilutėse) kaip „threadguru1“ ir mes pradedame giją.
- Kodo eilutė 8–9: Čia mes kuriame dar vieną „GuruThread3“ klasės egzempliorių (kuris sukurtas žemiau esančiose kodo eilutėse) kaip „threadguru2“ ir mes pradedame giją.
- 11 kodo eilutė: Čia mes kuriame klasę „GuruThread3“, kuri įgyvendina vykdomą sąsają (ją turėtų įdiegti bet kuri klasė, kurios egzempliorius ketina vykdyti gija.)
- Kodo eilutė 13-14: mes imame du klasės kintamuosius, iš kurių vienas yra tipo „thread“ klasės, kitas - „string“ klasės.
- Kodo eilutė 15-18: mes nepaisome „GuruThread3“ konstruktoriaus, kuris užima vieną argumentą kaip eilutės tipą (kuris yra gijų pavadinimas), kuris priskiriamas klasės kintamajam „guruname“ ir todėl gijos pavadinimas yra saugomas.
- Kodo eilutė 20: Čia mes viršijame bėgimo sąsajos run () metodą.
- Kodo eilutė 21: Mes pateikiame gijos pavadinimą naudodami „println“ sakinį.
- Kodo eilutė 22-31: Čia mes naudojame „for“ kilpą, kurios skaitiklis inicializuotas iki 0, ir jis neturėtų būti mažesnis nei 4 (galime paimti bet kurį skaičių, taigi čia kilpa veiks 4 kartus) ir padidinsime skaitiklį. Spausdiname gijų pavadinimą ir taip pat priversime miegą palikti 1000 milisekundžių bandymo sugavimo bloke, nes miego metodas patikrino išimtį.
- Kodo eilutė 33: Čia mes viršijame paleidžiamos sąsajos pradžios metodą.
- 35 kodo eilutė: Pateikiame tekstą „Gija pradėta“.
- Kodo eilutė 36–40: Čia pateikiama „if“ sąlyga, kad patikrintume, ar klasės kintamasis guruthread turi vertę, ar ne. Jei jo vertė yra nulinė, mes kuriame egzempliorių naudodami gijų klasę, kuri pavadina parametrą (kurio vertė buvo priskirta konstruktoriui). Po to gija pradedama naudojant start () metodą.
Vykdydami pirmiau nurodytą kodą gausite šį išvestį:
Išvestis :
Taigi yra dvi gijos, du kartus gauname pranešimą „Gija pradėta“.
Mes gauname gijų pavadinimus, kai mes juos išvedėme.
Jis eina į kilpą, kur mes spausdiname skaitiklio ir gijos pavadinimą, o skaitiklis prasideda 0.
Kilpa vykdoma tris kartus, o tarp sriegio miegama 1000 milisekundžių.
Taigi pirmiausia gauname guru1, tada guru2, tada vėl guru2, nes siūlas čia miega 1000 milisekundžių, o paskui kitas guru1 ir vėl guru1, siūlas miega 1000 milisekundžių, taigi gauname guru2 ir tada guru1.
Santrauka :
Šioje pamokoje mes matėme daugiasrieges programas „Java“ sistemoje ir tai, kaip naudoti pavienes ir kelias gijas.
- Daugialypiame gijime vartotojai nėra blokuojami, nes gijos yra nepriklausomos ir gali vienu metu atlikti kelias operacijas
- Įvairūs siūlų gyvavimo ciklo etapai yra:
- Nauja
- Bėgama
- Bėgimas
- Laukimas
- Miręs
- Mes taip pat sužinojome apie sinchronizavimą tarp gijų, kurios padeda programai veikti sklandžiai.
- Daugialypis siūlas palengvina daug daugiau programų užduočių.