JavaRush /Java Blog /Random-TK /Java-da köp okamak: manysy, artykmaçlyklary we umumy ýalň...

Java-da köp okamak: manysy, artykmaçlyklary we umumy ýalňyşlyklary

Toparda çap edildi
Salam! Ilki bilen gutlaýarys: Java-da köp okamak mowzugyna ýetdiňiz! Bu çynlakaý üstünlik, entek gaty köp ýol bar. Emma taýýar boluň: bu kursyň iň kyn mowzuklaryndan biridir. Esasy zat, bu ýerde çylşyrymly synplaryň ýa-da köp usullaryň ulanylmagy däl: tersine, hatda iki-de ýok. Pikiriňizi azajyk üýtgetmeli. Ondan öň programmalaryňyz yzygiderli ýerine ýetirilýärdi. Käbir setir setirleri beýlekileriň yzyna düşdi, käbir usullar beýlekileriň yzyna düşdi we umuman hemme zat düşnükli boldy. Ilki bilen bir zady hasaplaň, soňra netijäni konsolda görkeziň, soňra programmany bes ediň. Köp okalmagyna düşünmek üçin ylalaşyk nukdaýnazaryndan pikir etmek iň gowusydyr. Gaty ýönekeý bir zat bilen başlalyň :) Java-da köp okamak: manysy, peýdasy we umumy ýalňyşlyklary - 1Maşgalaňyzyň bir öýden beýlekisine göçýändigini göz öňüne getiriň. Hereket etmegiň möhüm bölegi kitaplaryňyzy gaplamakdyr. Siz köp kitap ýygnadyňyz we olary gutulara salmalysyňyz. Indi diňe siz erkin. Ejem nahar taýýarlaýar, dogan eşik ýygnaýar, aýal dogany bolsa dükana gitdi. Iň bärkisi ýeke özi dolandyryp bilersiňiz, iru-giç, hatda bu işi özüňizem ýerine ýetirersiňiz, ýöne bu köp wagt alar. Şeýle-de bolsa, 20 minutdan aýal doganyňyz dükandan gaýdyp geler we başga işi ýok. Şonuň üçin ol size goşulyp biler. Wezipe öňküligine galdy: kitaplary gutulara sal. Diňe iki esse çalt işleýär. Näme üçin? Sebäbi iş paralel ýerine ýetirilýär. Iki dürli “sapak” (siz we aýal doganyňyz) bir wagtyň özünde şol bir işi ýerine ýetirýärsiňiz we hiç zat üýtgemese, wagt tapawudy gaty uly bolar, hemme zady ýeke özi edersiňiz. Doganyňyz ýumuşyny ýakynda ýerine ýetirse, size kömek edip biler we zatlar hasam çaltlaşar.

Java-da köp okalýan meseleler çözülýär

Aslynda, Java köp okamak iki esasy meseläni çözmek üçin oýlanyp tapyldy:
  1. Bir wagtyň özünde birnäçe hereketi ýerine ýetiriň.

    Aboveokardaky mysalda dürli sapaklar (ýagny maşgala agzalary) paralel birnäçe hereket etdiler: gap-gaç ýuwup, dükana gitdiler, zatlary bukdular.

    Has “programmist” mysal getirip bolar. Ulanyjy interfeýsi bilen programmaňyzyň bardygyny göz öňüne getiriň. Dowam etmek düwmesi basylanda programmanyň içinde käbir hasaplamalar ýüze çykmaly we ulanyjy aşakdaky interfeýs ekranyny görmeli. Bu hereketler yzygiderli ýerine ýetirilse, "Dowam et" düwmesine basanyňyzdan soň programma doňup başlar. Ulanyjy ähli içerki hasaplamalar gutarýança we programma interfeýsiň çekilip başlanjak ýerine ýetýänçä “Dowam et” düwmesi bilen şol bir ekrany görer.

    Geliň, birnäçe minut garaşalyň!

    Java-da köp okamak: manysy, artykmaçlyklary we umumy ýalňyşlyklary - 3

    Şeýle hem, programmamyzy täzeden düzüp bileris ýa-da programmistleriň aýdyşy ýaly “paralelleşip bileris”. Gerekli hasaplamalar bir sapakda, beýlekisinde interfeýs görkezilsin. Kompýuterleriň köpüsinde munuň üçin ýeterlik çeşme bar. Bu ýagdaýda programma "samsyk" bolmaz we ulanyjy içerde bolup geçýän zatlar hakda aladalanman interfeýs ekranlarynyň arasynda arkaýyn hereket eder. Päsgel bermeýär :)

  2. Hasaplamalary çaltlaşdyryň.

    Bu ýerde hemme zat has ýönekeý. Prosessorymyzda birnäçe ýadro bar bolsa we prosessorlaryň köpüsi indi köp ýadroly bolsa, meseleler sanawymyz paralel birnäçe ýadro bilen çözülip bilner. Elbetde, 1000 meseläni çözmeli we olaryň hersi bir sekuntda çözülmeli bolsa, bir ýadro sanawy 1000 sekuntda, iki ýadro 500 sekuntda, üçüsi bary-ýogy 333 sekuntda we ş.m. çözer.

Emma, ​​leksiýada eýýäm okaýşyňyz ýaly, häzirki zaman ulgamlary gaty akylly, hatda bir hasaplaýyş ýadrosynda-da meseleler gezekli-gezegine ýerine ýetirilende paralellizmi ýa-da pseudo-parallelizmi durmuşa geçirip bilerler. Geliň, umumy zatlardan aýratyn zatlara geçeliň we köp kitap okamak bilen baglanyşykly Java kitaphanasyndaky esasy synp bilen tanyşalyň - java.lang.Thread. Gaty aýtsak, Java-daky sapaklar synpyň mysallary bilen görkezilýär Thread. 10agny, 10 sapak döretmek we işletmek üçin size bu synpyň 10 obýekti gerek bolar. Iň ýönekeý mysal ýazalyň:
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("I'm Thread! My name is " + getName());
   }
}
Sapaklary döretmek we işe girizmek üçin synp döretmeli we ondan miras almaly java.lang. Threadwe ondaky usuly ýok et run(). Iň soňkusy gaty möhümdir. Hut şu usul bilen, run()sapagymyzyň ýerine ýetirmeli logikasyny belleýäris. Indi bir mysal döredip MyFirstThread, ony işledip görsek, usul run()konsola öz ady bilen bir setir çap eder: usul getName()awtomatiki usulda berlen sapagyň “ulgam” adyny çap edýär. Aslynda näme üçin “eger”? Geliň, synap göreliň!
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {

           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
Konsol çykyşy: Men mowzuk! Meniň adym “Thread-2” men mowzuk! Meniň adym Thread-1 Men mowzuk! Meniň adym Thread-0 Men mowzuk! Meniň adym “Thread-3” men mowzuk! Meniň adym “Thread-6” men mowzuk! Meniň adym “Thread-7” men mowzuk! Meniň adym Thread-4 Men mowzuk! Meniň adym “Thread-5” men mowzuk! Meniň adym Thread-9 Men mowzuk! Meniň adym “Thread-8”, obýektiň usulyna jaň edip, MyFirstThreadmiras alýan we işe girizýän 10 sapak (obýekt) döredýäris . Usuly çagyrandan soň , onuň usuly işläp başlaýar we onda ýazylan logika ýerine ýetirilýär. Üns beriň: sapak atlary tertipli däl. Bu gaty geň, näme üçin öz gezeginde jezalandyrylmady : , we ş.m. Bu, adaty, “yzygiderli” pikirlenmegiň işlemejekdiginiň takyk mysaly. Hakykat, bu ýagdaýda diňe 10 sapak döretmek we işe girizmek üçin buýruklar berýäris. Olary haýsy tertipde işe girizmelidigini sapak meýilnamasy kesgitleýär: operasiýa ulgamynyň içindäki ýörite mehanizm. Onuň näderejede gurluşlydygy we haýsy prinsip boýunça karar berýändigi gaty çylşyrymly mowzuk, biz indi oňa girmeris. Rememberatda saklamaly esasy zat, programmistiň sapak ýerine ýetirilişiniň yzygiderliligini dolandyryp bilmezligi. Theagdaýyň çynlakaýlygyna düşünmek üçin usuly ýokardaky mysaldan birnäçe gezek işledip görüň. Ikinji konsol çykyşy: Men mowzuk! Meniň adym Thread-0 Men mowzuk! Meniň adym Thread-4 Men mowzuk! Meniň adym “Thread-3” men mowzuk! Meniň adym “Thread-2” men mowzuk! Meniň adym Thread-1 Men mowzuk! Meniň adym “Thread-5” men mowzuk! Meniň adym “Thread-6” men mowzuk! Meniň adym “Thread-8” men mowzuk! Meniň adym Thread-9 Men mowzuk! Meniň adym “Thread-7” üçünji konsol çykyşy: Men mowzuk! Meniň adym Thread-0 Men mowzuk! Meniň adym “Thread-3” men mowzuk! Meniň adym Thread-1 Men mowzuk! Meniň adym “Thread-2” men mowzuk! Meniň adym “Thread-6” men mowzuk! Meniň adym Thread-4 Men mowzuk! Meniň adym Thread-9 Men mowzuk! Meniň adym “Thread-5” men mowzuk! Meniň adym “Thread-7” men mowzuk! Meniň adym Thread-8Threadstart()start()run()Thread-0Thread-1Thread-2main()

Köp okalýan problemalar

Kitaplar bilen mysalda, köp okamagyň gaty möhüm meseleleri çözýändigini we ulanylyşynyň programmalarymyzyň işini çaltlaşdyrýandygyny gördüňiz. Köp halatlarda - köp gezek. Multöne köp okamagyň çylşyrymly mowzuk hasaplanmagy hiç zat üçin däl. Galyberse-de, nädogry ulanylsa, olary çözmegiň ýerine problemalar döredýär. "Mesele dörediň" diýlende, abstrakt bir zady aňlatmaýaryn. Köp okamagyň sebäp bolup biljek iki sany aýratyn meselesi bar: petik we ýaryş ýagdaýy. Öçürmek, köp sapaklaryň biri-biriniň eýeleýän çeşmelerine garaşýan we olaryň hiç biri-de ýerine ýetirip bilmeýän ýagdaý. Geljekki leksiýalarda bu barada has giňişleýin gürleşeris, ýöne häzirlikçe bu mysal ýeterlikdir: Java-da köp okamak: manysy, artykmaçlyklary we umumy ýalňyşlyklary - 4 1-nji sapak käbir Obýekt-1 bilen, sapak-2 bolsa Obýekt-2 bilen işleýär diýip göz öňüne getiriň. Programma şeýle ýazylýar:
  1. “Thread-1” “Object-1” bilen işlemegi bes eder we “Thread-2” 2-nji obýekt bilen işlemegi bes edip, Obýekt-1-e geçen badyna Obýekt-2-e geçer.
  2. “Thread-2” “Object-2” bilen işlemegi bes eder we “Thread-1” 1-nji obýekt bilen işlemegini bes edip, Obýekt-2-e geçen badyna Obýekt-1-e geçer.
Köp okalmagy çuňňur bilmeseňizem, hiç zadyň gelmejekdigine aňsatlyk bilen düşünip bilersiňiz. Saplar hiç wagt ýerleri üýtgetmez we biri-birine baky garaşar. Erroralňyşlyk görnüp dur, ýöne aslynda beýle däl. Programma aňsatlyk bilen rugsat berip bilersiňiz. Aşakdaky leksiýalarda petiklenmä sebäp bolýan kodlaryň mysallaryna serederis. Theeri gelende aýtsak, Quora petiklemäniň nämedigini düşündirýän ajaýyp hakyky durmuş mysaly bar . “Hindistanyň käbir ştatlarynda, daýhan hökmünde hasaba alynmasaňyz, size oba hojalygy ýerlerini satmazlar. Şeýle-de bolsa, oba hojalygyna degişli ýeriňiz bolmasa, daýhan hökmünde hasaba alynmarsyňyz "-diýdi. Gowy, men näme aýdyp bilerin! :) Indi ýaryşyň ýagdaýy - ýaryşyň ýagdaýy barada. Racearyş şerti, köp sapakly ulgamda ýa-da programmanyň dizaýn kemçiligi bolup, ulgamyň ýa-da programmanyň işleýşi koduň bölekleriniň ýerine ýetirilişine baglydyr. Işleýän sapaklar bilen mysaly ýadyňyzda saklaň: Java-da köp okamak: manysy, peýdasy we umumy ýalňyşlyklary - 5
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("Выполнен поток " + getName());
   }
}

public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {

           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
Indi programmanyň iýmit taýýarlaýan robotyň işlemegine jogapkärdigini göz öňüne getiriň! Threadumurtga-0 ýumurtgalary holodilnikden çykarýar. 1-nji akym peçde açylýar. Akym-2 gowurma tabagyny çykaryp, peje goýýar. 3-nji akym peçde ot ýakýar. 4-nji akym gazana ýag guýýar. 5-nji akym ýumurtgalary döwýär we gowurmaly. 6-njy akym gabyklary hapa zyňýar. “Stream-7” taýýar dogramaly ýumurtgalary otdan çykarýar. Potok-8 dogramaly ýumurtgalary bir tabaga goýýar. 9-njy akym gap-gaç ýuwýar. Programmamyzyň netijelerine serediň: Thread-0 ýerine ýetirilen Thread-2 sapak ýerine ýetirilen Thread-1 sapak ýerine ýetirilen Thread-4 sapak ýerine ýetirilen Thread-9 sapak ýerine ýetirilen Thread-8 sapak ýerine ýetirilen Thread-7 sapak Thread-7 ýerine ýetirildi ýerine ýetirilen sapak -3 sapak-6 sapak ýerine ýetirildi. scriptazgy gyzyklymy? :) Hemmesi, sebäbi programmamyzyň işleýşi sapaklaryň ýerine ýetirilişine baglydyr. Yzygiderliligiň sähelçe bozulmagy bilen aşhanamyz dowzaha öwrülýär we däli bolup giden robot töweregindäki ähli zady ýok edýär. Bu, köp okalýan programmirlemekde umumy mesele, bir gezekden köp eşidersiňiz. Leksiýanyň ahyrynda size köp okalýan kitap maslahat beresim gelýär.
Java-da köp okamak: manysy, peýdasy we umumy ýalňyşlyklary - 6
“Praktikada Java ylalaşygy” 2006-njy ýylda ýazylypdy, ýöne ähmiýetini ýitirmedi. Java-da köp okalýan programmirlemegi öz içine alýar, esaslardan başlap, iň köp ýaýran ýalňyşlyklaryň we antipatternleriň sanawy bilen gutarýar. Köp okalýan programmirleme guraly bolmak kararyna gelen bolsaňyz, bu kitap hökman okalmalydyr. Indiki leksiýalarda görüşeris! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION