Monisäikeinen Java-opetusohjelma esimerkkien avulla

Sisällysluettelo:

Anonim

Kaikilla sovelluksilla voi olla useita prosesseja (instansseja). Kukin tämä prosessi voidaan määrittää joko yhtenä ketjuna tai useana ketjuna. Näemme tässä opetusohjelmassa, kuinka voit suorittaa useita tehtäviä samanaikaisesti ja oppia myös lisää ketjuista ja ketjujen välisestä synkronoinnista.

Tässä opetusohjelmassa opimme:

  • Mikä on yksi ketju
  • Mitä on monisäikeinen Java?
  • Langan elinkaari Javassa
  • Java-ketjun synkronointi
  • Java-monisäikeinen esimerkki

Mikä on yksi ketju?

Yksi lanka on pohjimmiltaan kevyt ja pienin käsittelyyksikkö. Java käyttää ketjuja käyttämällä "säieluokkaa".

Lankaa on kahta tyyppiä - käyttäjän säie ja daemon-säie (daemon-säikeitä käytetään, kun haluamme puhdistaa sovelluksen, ja niitä käytetään taustalla).

Kun sovellus käynnistyy ensimmäisen kerran, luodaan käyttäjälanka. Lähetä tämä, voimme luoda monia käyttäjän ketjuja ja daemon-ketjuja.

Esimerkki yhdestä langasta:

paketin demotest;julkisen luokan GuruThread{public staattinen void main (String [] argumentoi) {System.out.println ("yksi ketju");}}

Yhden kierteen edut:

  • Vähentää yleiskustannuksia sovelluksessa, kun yksisäikeinen suoritus suoritetaan järjestelmässä
  • Lisäksi se vähentää sovelluksen ylläpitokustannuksia.

Mitä on monisäikeinen Java?

MULTITHREADING Java on prosessi, jossa suoritetaan kaksi tai useampia ketjuja samanaikaisesti CPU: n maksimaalisen hyödyntämisen varmistamiseksi. Monisäikeiset sovellukset suorittavat kaksi tai useampia samanaikaisesti suoritettavia ketjuja. Siksi se tunnetaan myös nimellä Java samanaikaisesti. Jokainen lanka kulkee yhdensuuntaisesti toistensa kanssa. Useat säikeet eivät varaa erillistä muistialuetta, joten ne säästävät muistia. Myös kontekstin vaihtaminen ketjujen välillä vie vähemmän aikaa.

Esimerkki monisäikeisestä:

paketin demotest;julkisen luokan GuruThread1 toteuttaa Runnable{public staattinen void main (String [] argumentoi) {Viestiketju guruThread1 = uusi säie ("Guru1");Viestiketju guruThread2 = uusi säie ("Guru2");guruThread1.start ();guruThread2.start ();System.out.println ("Säikeiden nimet ovat seuraavat:");System.out.println (guruThread1.getName ());System.out.println (guruThread2.getName ());}@Ohittaapublic void run () {}}

Monisäikeisen edut:

  • Käyttäjiä ei ole estetty, koska ketjut ovat itsenäisiä, ja voimme suorittaa useita toimintoja ajoittain
  • Koska tällaiset ketjut ovat itsenäisiä, muut säikeet eivät vaikuta, jos yksi säie täyttää poikkeuksen.

Langan elinkaari Javassa

Langan elinkaari:

Langan elinkaaren eri vaiheita on esitetty yllä olevassa kaaviossa:

  1. Uusi
  2. Ajettava
  3. Juoksu
  4. Odottaa
  5. Kuollut
  1. Uusi: Tässä vaiheessa säie luodaan luokan "Thread class" avulla. Se pysyy tässä tilassa, kunnes ohjelma aloittaa langan. Se tunnetaan myös nimellä syntynyt lanka.
  2. Suoritettava: Tällä sivulla ketjun esiintymä kutsutaan aloitusmenetelmällä. Lankojen hallinta annetaan ajastimelle suorituksen loppuun saattamiseksi. Aikataulusta riippuu, suoritetaanko ketju.
  3. Käynnissä: Kun ketju alkaa suorittaa, tila muutetaan "käynnissä" -tilaksi. Ajastin valitsee yhden ketjun säiejoukosta ja se alkaa suorittaa sovelluksessa.
  4. Odottaa: Tämä on tila, jolloin langan on odotettava. Koska sovelluksessa on käynnissä useita ketjuja, ketjujen välinen synkronointi on tarpeen. Siksi yhden langan on odotettava, kunnes toinen säie suoritetaan. Siksi tätä tilaa kutsutaan odottavaksi tilaksi.
  5. Kuollut: Tämä on tila, jolloin säie päättyy. Lanka on käynnissä ja heti kun käsittely on valmis, se on "kuolleessa tilassa".

Joitakin langan yleisesti käytettyjä menetelmiä ovat:

Menetelmä Kuvaus
alkaa() Tämä menetelmä aloittaa ketjun suorittamisen ja JVM kutsuu run () -metodin ketjussa.
Lepotila (millisekunteina) Tämä menetelmä saa langan lepotilaan, joten langan suoritus keskeytyy tarjotun millisekunnin ajan ja sen jälkeen taas ketju alkaa suorittaa. Tämä auttaa ketjujen synkronoinnissa.
getName () Se palauttaa langan nimen.
setPriority (int newpriority) Se muuttaa langan prioriteettia.
saanto () Se aiheuttaa nykyisen langan pysähtymisen ja muiden ketjujen suorittamisen.

Esimerkki: Tässä esimerkissä aiomme luoda ketjun ja tutkia ketjuille käytettävissä olevia sisäänrakennettuja menetelmiä.

paketin demotest;public class thread_example1 toteuttaa Runnable {@Ohittaapublic void run () {}public staattinen void main (String [] argumentoi) {Kierteen guruthread1 = uusi lanka ();guruthread1.start ();yrittää {guruthread1.sleep (1000);} catch (InterruptedException e) {// TODO Automaattisesti luotu salpalohkoe.printStackTrace ();}guruthread1.setPriority (1);int gurupriority = guruthread1.getPriority ();System.out.println (turhuus);System.out.println ("ketju käynnissä");}}

Koodin selitys:

  • Koodirivi 2: Luomme luokan "thread_Example1", joka toteuttaa Runnable-käyttöliittymän (sen pitäisi olla minkä tahansa luokan toteuttama, jonka esiintymät on tarkoitettu ketjun suorittamaan)
  • Koodirivi 4: Se ohittaa ajettavan käyttöliittymän ajomenetelmän, koska tämä menetelmä on pakollinen ohittaa
  • Koodirivi 6: Tässä on määritelty päämenetelmä, jolla aloitamme langan suorittamisen.
  • Koodirivi 7: Tässä luomme uuden ketjunimen nimellä "guruthread1" luomalla uusi ketjuluokka.
  • Koodirivi 8: käytämme ketjun "start" -menetelmää käyttäen "guruthread1" -instanssia. Tässä ketju alkaa suorittaa.
  • Koodirivi 10: Tässä käytämme langan "lepotilamenetelmää" käyttäen "guruthread1" -instanssia. Siksi lanka nukkuu 1000 millisekuntia.
  • Koodi 9-14: Tässä olemme asettaneet lepotavan kokeilunestolohkoon, koska on olemassa valittu poikkeus, joka tapahtuu, ts. Keskeytetty poikkeus.
  • Koodirivi 15: Tässä asetamme langan prioriteetiksi 1 riippumatta siitä, mikä prioriteetti se oli
  • Koodirivi 16: Tässä saamme langan prioriteetin getPriority () -ominaisuuden avulla
  • Koodirivi 17: Tässä tulostetaan getPriority-haettu arvo
  • Koodirivi 18: Tässä kirjoitetaan tekstiä, jonka ketju on käynnissä.

Kun suoritat yllä olevan koodin, saat seuraavan tuloksen:

Tuotos:

5 on langan prioriteetti, ja langan juoksu on teksti, joka on koodimme lähtö.

Java-ketjun synkronointi

Monisäikeisissä ohjelmissa esiintyy asynkronista käyttäytymistä. Jos yksi ketju kirjoittaa tietoja ja toinen ketju, joka lukee tietoja samanaikaisesti, saattaa aiheuttaa epäjohdonmukaisuutta sovelluksessa.

Kun on tarvetta käyttää jaettuja resursseja kahdella tai useammalla ketjulla, käytetään synkronointimenetelmää.

Java on tarjonnut synkronoituja menetelmiä synkronoidun käyttäytymisen toteuttamiseksi.

Tässä lähestymistavassa, kun säie saavuttaa synkronoidun lohkon sisälle, mikään muu ketju ei voi kutsua tätä menetelmää samalle objektille. Kaikkien ketjujen on odotettava, kunnes säie päättää synkronoidun lohkon ja tulee siitä ulos.

Tällä tavalla synkronointi auttaa monisäikeisessä sovelluksessa. Yhden säikeen on odotettava, kunnes toinen säie päättää suorituksen vasta sitten, muut säikeet sallitaan suorittaa.

Se voidaan kirjoittaa seuraavassa muodossa:

Synkronoitu (objekti){// Synkronoitavat lauseet}

Java-monisäikeinen esimerkki

Tässä esimerkissä otamme kaksi ketjua ja haemme langan nimet.

Esimerkki 1:

GuruThread1.javapaketin demotest;julkisen luokan GuruThread1 toteuttaa Runnable {/ *** @param väittää* /public staattinen void main (String [] argumentoi) {Viestiketju guruThread1 = uusi säie ("Guru1");Viestiketju guruThread2 = uusi säie ("Guru2");guruThread1.start ();guruThread2.start ();System.out.println ("Säikeiden nimet ovat seuraavat:");System.out.println (guruThread1.getName ());System.out.println (guruThread2.getName ());}@Ohittaapublic void run () {}}

Koodin selitys:

  • Koodirivi 3: Olemme ottaneet luokan "GuruThread1", joka toteuttaa Runnable-sovelluksen (sen pitäisi toteuttaa kaikki luokat, joiden esiintymät on tarkoitettu ketjun suorittamaan.)
  • Koodirivi 8: Tämä on luokan päämenetelmä
  • Koodirivi 9: Tässä haastetaan Thread-luokka ja luodaan ilmentymä nimeltä "guruThread1" ja luodaan ketju.
  • Koodirivi 10: Tässä haastetaan Thread-luokka ja luodaan ilmentymä nimeltä "guruThread2" ja luodaan ketju.
  • Koodirivi 11: Aloitamme ketjun eli guruThread1.
  • Koodirivi 12: Aloitamme ketjun eli guruThread2.
  • Koodirivi 13: Tekstin kirjoittaminen "Langanimet ovat seuraavat:"
  • Koodirivi 14: Langan 1 nimen saaminen ketjuluokan getName () avulla.
  • Koodirivi 15: Langan 2 nimen saaminen ketjuluokan getName () avulla.

Kun suoritat yllä olevan koodin, saat seuraavan tuloksen:

Tuotos:

Langanimet tuotetaan täällä nimellä

  • Guru1
  • Guru2

Esimerkki 2:

Tässä esimerkissä opitaan juoksevan rajapinnan run () ja start () -menetelmistä ja luodaan kaksi kyseisen luokan ketjua ja suoritetaan ne vastaavasti.

Lisäksi käymme kahta luokkaa,

  • Yksi, joka toteuttaa ajettavan käyttöliittymän ja
  • Toinen menetelmä, jolla on päämenetelmä ja joka toteutetaan vastaavasti.
paketin demotest;julkinen luokka GuruThread2 {public staattinen void main (String [] argumentoi) {// TODO Automaattisesti luotu menetelmän tynkäGuruThread3 threadguru1 = uusi GuruThread3 ("guru1");threadguru1.start ();GuruThread3 threadguru2 = uusi GuruThread3 ("guru2");threadguru2.start ();}}luokan GuruThread3 toteuttaa Runnable {Langan guruthread;yksityinen merkkijono guruname;GuruThread3 (merkkijono) {guruname = nimi;}@Ohittaapublic void run () {System.out.println ("ketju käynnissä" + guruname);(int i = 0; i <4; i ++) {System.out.println (i);System.out.println (guruname);yrittää {Lanka. Unessa (1000);} catch (InterruptedException e) {System.out.println ("Viestiketju on keskeytetty");}}}julkinen mitätön alku () {System.out.println ("Viestiketju aloitettu");jos (guruthread == null) {guruthread = uusi säie (tämä, guruname);guruthread.start ();}}}

Koodin selitys:

  • Koodirivi 2: Tässä valitaan luokka "GuruThread2", jolla on päämenetelmä.
  • Koodirivi 4: Tässä valitaan luokan päämenetelmä.
  • Koodirivi 6-7: Tässä luodaan luokan GuruThread3 (joka luodaan koodin alapuolelle) esiintymä nimellä "threadguru1" ja aloitamme ketjun.
  • Koodirivi 8-9: Täällä luomme toisen luokan GuruThread3 (joka on luotu koodin alapuolelle) ilmentymän "threadguru2" ja aloitamme ketjun.
  • Koodirivi 11: Tässä luodaan luokka "GuruThread3", joka toteuttaa juoksevan käyttöliittymän (sen pitäisi olla minkä tahansa luokan toteuttama, jonka esiintymät on tarkoitettu ketjun suorittamaan.)
  • Koodirivi 13-14: Otamme kaksi luokkamuuttujaa, joista toinen kuuluu tyypin säie-luokkaan ja toinen merkkijonoluokkaan.
  • Koodirivi 15-18: ohitamme GuruThread3-konstruktorin, joka ottaa yhden argumentin merkkijonotyypiksi (joka on ketjun nimi), joka määritetään luokan muuttujalle guruname ja siten säikeen nimi tallennetaan.
  • Koodirivi 20: Tässä ohitetaan ajettavan käyttöliittymän run () -menetelmä.
  • Koodirivi 21: Annamme ketjun nimen käyttämällä println-käskyä.
  • Koodirivi 22-31: Tässä käytetään for-silmukkaa, jonka laskuri on alustettu 0: een, eikä sen pitäisi olla pienempi kuin 4 (voimme ottaa minkä tahansa luvun, joten silmukka toimii tässä 4 kertaa) ja kasvatamme laskuria. Tulostamme langan nimeä ja myös langan lepotilassa 1000 millisekuntia try-catch-lohkossa, kun lepotapa nosti tarkistetun poikkeuksen.
  • Koodirivi 33: Tässä ohitetaan ajettavan käyttöliittymän aloitusmenetelmä.
  • Koodirivi 35: Tulostamme tekstin "Viestiketju aloitettu".
  • Koodirivi 36-40: Tässä tarkastellaan if-ehtoa tarkistamaan, onko luokan muuttujalla guruthread arvoa vai ei. Jos sen arvo on null, luomme ilmentymän käyttämällä säieluokkaa, joka ottaa nimen parametriksi (arvo, jolle on määritetty konstruktori). Tämän jälkeen lanka aloitetaan käyttämällä start () -menetelmää.

Kun suoritat yllä olevan koodin, saat seuraavan tuloksen:

Tuotos :

Ketjuja on siis kaksi, saamme kaksi kertaa viestin "Viestiketju aloitettu".

Saamme langan nimet, kun olemme antaneet ne.

Se menee silmukkaan, jossa tulostamme laskurin ja langan nimen ja laskuri alkaa 0: lla.

Silmukka suoritetaan kolme kertaa ja langan välissä nukutetaan 1000 millisekuntia.

Siksi ensin saamme guru1, sitten guru2, sitten taas guru2, koska lanka nukkuu täällä 1000 millisekuntia ja sitten seuraava guru1 ja taas guru1, lanka nukkuu 1000 millisekuntia, joten saamme guru2 ja sitten guru1.

Yhteenveto :

Tässä opetusohjelmassa näimme monisäikeisiä sovelluksia Java-ohjelmassa ja kuinka käyttää yksi- ja monisäikeisiä ketjuja.

  • Monisäikeisessä käytössä käyttäjiä ei estetä, koska ketjut ovat itsenäisiä ja voivat suorittaa useita toimintoja kerrallaan
  • Langan elinkaaren eri vaiheet ovat,
    • Uusi
    • Ajettava
    • Juoksu
    • Odottaa
    • Kuollut
  • Opimme myös ketjujen välisestä synkronoinnista, jotka auttavat sovellusta toimimaan sujuvasti.
  • Monisäikeisyys helpottaa monia muita sovellustehtäviä.