Erinevus une ja ootamise vahel Javas

Sisukord:

Erinevus une ja ootamise vahel Javas
Erinevus une ja ootamise vahel Javas

Video: Erinevus une ja ootamise vahel Javas

Video: Erinevus une ja ootamise vahel Javas
Video: Java Multithreading : AtomicReference, ScheduledExecutorService и монада Either. Многопоточность. 2024, Juuli
Anonim

Peamine erinevus – Javas magamine vs ootamine

Uinu ja oota on kaks meetodit, mida Javas kasutatakse mitme lõimega töötlemiseks. Unerežiim kuulub Thread klassi, ootemeetod aga objekti klassist. Peamine erinevus unerežiimi ja ootamise vahel Javas seisneb selles, et unerežiimi kasutatakse praeguse lõime täitmise peatamiseks määratud arvuks millisekunditeks, samal ajal kui ootemeetodit kasutatakse selleks, et praegune lõim ootaks, kuni mõni teine lõim kutsub välja teavituse või objekti notifyAll meetod.

Lõime on operatsioonisüsteemi väikseim töötlusüksus. See on üks järjestikune juhtimisvoog programmi sees. Niidid on kerged. Multithreading on mehhanism mitme lõime samaaegseks käivitamiseks. Programmeerimiskeeled, nagu Java, toetavad mitme lõimega töötlemist. Mitme lõimega töötlemisel on eelised, kuna see võimaldab käivitada mitu lõime samaaegselt ja niidid on üksteisest sõltumatud. Javas on meetodeid, mida saab kasutada mitme lõimega töötlemiseks. Kaks neist magavad ja ootavad.

Mis on uni Javas?

Operatsioonisüsteemis töötab mitu protsessi. Protsess on käivitatav programm. Igal protsessil võib olla mitu lõime ja nende lõimede vahel toimub kontekstivahetus. Javas on lõime loomiseks kaks võimalust. See on lõime klassi laiendamine või Runnable liidese juurutamine. Lõime klassis on konstruktorid ja meetodid lõime loomiseks ja toimingute tegemiseks. Klass Thread laiendab objekti klassi ja rakendab Runnable liidest. Käivitatavat liidest peaks rakendama iga klass, mille eksemplarid on ette nähtud lõimega täitmiseks. Kui lõim käivitub, kirjutatakse käivitatav kood käitamismeetodi sisse. Lõim, mis peaks töötama, valib lõime ajakava. Ühes protsessis töötab ainult üks lõim.

Lõim läbib mitu etappi. Pärast Thread klassi objekti loomist saab programmeerija käivitada käivitusmeetodi. Enne selle meetodi käivitamist väidetakse, et lõim on uues olekus. Lõime ajakava valib käitamiseks lõime. Kui lõime pole lõime ajakavaga veel valinud, kuid käivitamise meetod on käivitatud, on lõim käivitatavas olekus. Kui lõime ajakava valib käivitatava lõime, läheb see tööolekusse. Kui lõim on elus, kuid pole praegu käitamiseks sobilik, siis on see mittekäivitatavas või blokeeritud olekus. Pärast käitamismeetodi lõpetamist läheb lõim lõpetatud olekusse. Need on niidi elutsükli peamised faasid.

Lõimede klassis on saadaval erinevaid meetodeid erinevate ülesannete täitmiseks. Unemeetodit kasutatakse meetodi magamiseks teatud aja jooksul. Unerežiimi süntaks on avalik unerežiim (pikad millisekundid), mis viskab InterruptedException. See põhjustab praegu töötava lõime täitmise ajutiseks peatamiseks määratud arvu millisekunditeks. Kui mõni teine lõim katkestab praeguse lõime, kustutatakse selle erandi korral praeguse lõime katkestatud olek.

Erinevus Javas magamise ja ootamise vahel
Erinevus Javas magamise ja ootamise vahel

Joonis 01: Java programm unerežiimiga

Vastav alt ül altoodud programmile sisaldab käitamismeetod koodi, mis tuleks käivitada. Põhiprogrammis luuakse kaks ExampleThread1 objekti ja käivitatakse nendel käivitusmeetodid. See võimaldab koodi käitada käitamismeetodis. Korraga käivitub ainult üks lõim. Lõngaga.uni (1000); lubab esimesel lõimel täitmise 1000 millisekundiks lõpetada. Kui lõim magab, valib lõime ajakava teise lõime.

Mis on Javas ootamine?

Mitmed lõimed võivad juurdepääsu jagatud ressursile. See võib põhjustada vale väljundi genereerimist. Lõime sünkroonimist saab kasutada ainult ühe lõime loomiseks, et pääseda juurde jagatud ressursile. Oletame järgmist olukorda. Kui t1 ja t2 on kaks lõime, alustab t1 väärtuste salvestamist tekstifaili nimega Text1.txt. Neid väärtusi kasutatakse mõne muu arvutuse jaoks, kui t1 tagastab. Kui t2 algab enne t1 naasmist, saab t2 muuta t1 poolt salvestatud väärtusi. See võib põhjustada t1 vale väljundi. Kui t1 hakkab faili Text1.txt kasutama, saab sünkroonimise abil selle faili lukustada, nii et sellele pääseb ligi ainult t1. T2 ei saa seda muuta enne, kui t1 vabastab selle tekstifaili juurdepääsu lukustuse. Kui ülesanne on lõpetatud, saab t1 lukustuse vabastada. Lukku tuntakse ka monitorina.

Lõimede sünkroonimist saab saavutada lõimedevahelise suhtluse abil. Kriitiline jaotis on koodisegment, mis pääseb juurde jagatud ressurssidele. Lõimedevahelises suhtluses peatatakse lõime töötamine selle kriitilises sektsioonis ja teisel lõimel lubatakse siseneda samasse kriitilisse sektsiooni, et seda käivitada. Seda rakendatakse oote-, teavitus- ja teavitusmeetodite abil. Need kuuluvad objektide klassi. Ootamismeetodit kasutatakse selleks, et lubada praegusel lõimel lukustus vabastada ja oodata, kuni mõni teine lõim käivitab objekti teavitamis- või notifyAll-meetodi. Teavitamise meetodit kasutatakse ühe lõime, mis ootab lukku, äratamiseks. NotifyAll äratab kõik lukus ootavad lõimed.

Une- ja ooterežiimi erinevus Javas_Joonis 02
Une- ja ooterežiimi erinevus Javas_Joonis 02

Joonis 02: Kalkulaatori klass

Peamised erinevused Javas magamise ja ootamise vahel
Peamised erinevused Javas magamise ja ootamise vahel

Joonis 03: Põhimeetod

Kalkulaatori klass laiendab lõime. Sünkroniseeritud plokk on käitamismeetodi sees. For loop ja teavitusmeetod on sünkroniseeritud ploki sees. Põhimeetodi sees kutsutakse sellel eksemplaril loodud lõime eksemplar ja käivitamismeetod. Peamine meetod ootab, kuni lõim teatab. Programmi käivitamisel ootab põhimeetod kuni kogu käivitusmeetodi täitmiseni ja ootab teavitusmeetodit. Kui teavitusmeetod on välja kutsutud, lõpetab põhimeetod ootamise ja alustab ülejäänud koodi täitmist. Peamine ootab, kuni kalkulaatori lõime on lõpetatud. Lõpuks trükitakse summa tulemus.

Kui sünkroonitud plokki pole ja kui põhimeetodil on alljärgnev kood, annab see väljundi nulliks, kuna see ei oota teise lõime lõpetamist.

Kalkulaator t1=uus kalkulaator ();

t1. algus ();

System.out.println (t1.sum);

Mis on Javas magamise ja ootamise sarnasus?

Nii magamine kui ka ootamine on meetodid, mida saab Java-s mitmelõime rakendamisel kasutada

Mis vahe on Javas unel ja ootamisel?

magamine vs ootamine Javas

Unerežiim peatab praeguse lõime täitmise määratud arvu millisekunditeks, olenev alt süsteemi taimerite ja ajakavade täpsusest. Ootamismeetod paneb praeguse lõime ootama, kuni mõni teine lõim kutsub objekti jaoks välja meetodi notify või notifyAll.
Seos lukuga
Unerežiim ei vabasta sünkroonimise ajal objekti lukku. Ootemeetod vabastab sünkroonimise ajal lukustuse.
Täitmisviis
Unerežiimi meetod käivitatakse praeguses lõimes. Ootamismeetod kutsutakse objektil välja.
Seotud klass
Unerežiim on lõimeklassi meetod. Ootamine on objektiklassi meetod.
Lõpetamine
Unerežiim lõpetatakse pärast määratud aja möödumist. Ootemeetod katkestatakse teavitus- või notifyAll meetodite kutsumisega.

Kokkuvõte – magamine vs ootamine Javas

Operatsioonisüsteemis töötab mitu protsessi. Igal protsessil võib olla mitu lõime. Lõim on operatsioonisüsteemi väikseim töötlusüksus. Java programmeerimiskeel toetab mitme lõimega töötlemist. See võimaldab käivitada mitu lõime samaaegselt. Unerežiim ja ootamine on kaks meetodit, mida saab kasutada mitme keermestamise rakendamisel. Unerežiimi ja ootamise erinevus Javas seisneb selles, et unerežiimi kasutatakse praeguse lõime täitmise peatamiseks määratud arvuks millisekunditeks, samal ajal kui ootemeetodit kasutatakse selleks, et praegune lõim ootaks, kuni mõni teine lõim kutsub välja teavitus- või teavituskäsu meetod objekti jaoks.

Soovitan: