JavaRush /Java Blog /Random-TK /Köp okalýan zat: sapak sapaklarynyň usullary

Köp okalýan zat: sapak sapaklarynyň usullary

Toparda çap edildi
Salam! Bu gün köp okamak hakda gürleşmegi dowam etdirýäris. Geliň, sapak synpyna we onuň birnäçe usullarynyň işleýşine göz aýlalyň. Ozal synp usullaryny öwrenenimizde, köplenç muny şeýle ýazýardyk: “usulyň ady” -> “näme edýär.”
Köp okamak: Sapak synpynyň usullary näme edýär - 1
Bu sapak usullary bilen işlemez :) Olaryň logikasy has çylşyrymly we birnäçe mysal bolmasa düşünmek mümkin däl.

Thread.start () usuly

Gaýtalamakdan başlalyň. Probablyadyňyzda bolsa, synpyňyzy synpdan miras alyp Thread, ondaky usuly ýok edip, bir sapak döredip bilersiňiz run(). Emma, ​​elbetde, öz-özünden başlamaz. Munuň üçin usuly obýektimiz diýip atlandyrýarys start(). Köp okamak: Sapak synpynyň usullary näme edýär - 2Öňki leksiýadan mysal alalyň:
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();
       }
   }
}
Üns beriň: sapagy başlamak üçin ýörite usuly çagyrmalystart()däl-derun()! Esasanam köp okalmagy öwreneniňizde, bu ýalňyş ýalňyşlyk. Mysalymyzdarun()däl-destart(), netije şeýle bolar:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
Thread-0 sapak ýerine ýetirildi Thread-1 sapak ýerine ýetirildi Thread-2 sapak ýerine ýetirildi Thread-3 sapak ýerine ýetirildi Thread-4 sapak ýerine ýetirildi Thread-6 sapak ýerine ýetirildi Thread-7 sapak ýerine ýetirildi Thread-8 sapak ýerine ýetirildi Thread-9 sapak ýerine ýetirildi Çykyş yzygiderliligine serediň: hemme zat tertipli bolýar. Geň, şeýlemi? Biz muňa öwrenişmedik, sebäbi sapaklaryň işe girizilmeginiň we ýerine ýetiriliş tertibiniň operasiýa ulgamymyzdaky gözegçilik gözegçiligi - sapak meýilnamasy tarapyndan kesgitlenýändigini eýýäm bilýäris. Belki, men diňe bagtlydym? Elbetde, bu bagt meselesi däl. Programmany ýene iki gezek işledip tassyklap bilersiňiz. Esasy zat, usuly çagyrmagyňrun()köp okamak bilen hiç hili baglanyşygy ýok. Bu ýagdaýda programma esasy sapakda - usulyň ýerine ýetirilişinde ýerine ýetirilermain(). Diňe konsola yzygiderli 10 setir çykar we hut şu. Hiç hili 10 sapak başlamaz. Şonuň üçin geljegi ýatdan çykarmaň we yzygiderli özüňizi barlaň. Edilmegini isleseňizrun(), jaň ediňstart(). Geliň dowam edeliň.

Thread.sleep () usuly

Häzirki sapagyň ýerine ýetirilişini birnäçe wagtlap duruzmak üçin, ulanyň sleep(). Köp okamak: sapak synpynyň usullary näme edýär - 3Usul sleep()parametr hökmünde millisekunt sanyny, ýagny sapagyň uklamaly wagtyny alýar.
public class Main {

   public static void main(String[] args) throws InterruptedException {

       long start = System.currentTimeMillis();

       Thread.sleep(3000);

       System.out.println(" - Сколько я проспал? \n - " + ((System.currentTimeMillis()-start)) / 1000 + " секунды");

   }
}
Konsol çykyşy: - Näçe wagtlap ýatdym? - 3 sekunt Üns beriň: usul sleep()statik: häzirki sapagy uklaýar. .Agny, häzirki wagtda işleýän biri. Anotherene bir möhüm nuans: uky ýagdaýynyň akymy kesilip bilner. Bu ýagdaýda programmada kadadan çykma ýüze çykar InterruptedException. Aşakdaky bir meselä serederis. ? Eri gelende aýtsak, sapak “oýanandan” soň näme bolýar? Executionerine ýetirilişini giden ýerinden derrew dowam etdirermi? No.ok. Threadüplük oýanandan soň, argumentiň wagty gutaranda , işledilýänThread.sleep() ýagdaýa girýär . Şeýle-de bolsa, bu sapak meýilleşdirijisiniň işlejekdigini aňlatmaýar. Beýleki käbir “uklamaýan” sapaklara artykmaçlyk bermegi we “täze oýanan” sapagymyz biraz soň işlemegini dowam etdirer. Rememberadyňyzdan çykarmaň: “oýanmak, şol sekuntda işlemegi aňlatmaýar!”

Thread.join () usuly

Köp okamak: sapak synpynyň usullary näme edýär - 4Usul, join()başga bir sapak gutarýança häzirki sapagyň ýerine ýetirilmegini togtadýar. 2 sapak bar bolsa t1, t2we ýazarys -
t1.join()
t2t1 işini tamamlaýança işe başlamaz. Usul join()sapaklaryň ýerine ýetiriliş yzygiderliligini üpjün etmek üçin ulanylyp bilner. Geliň, işe join()mysal hökmünde seredeliň:
public class ThreadExample extends Thread {

   @Override
   public void run() {

       System.out.println("Начало работы потока " + getName());

       try {
           Thread.sleep(5000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("Поток " + getName() +  " завершил работу.");
   }
}


public class Main {

   public static void main(String[] args) throws InterruptedException {

       ThreadExample t1 = new ThreadExample();
       ThreadExample t2 = new ThreadExample();

       t1.start();


 /*Второй поток t2 начнет выполнение только после того, How будет завершен
       (or бросит исключение) первый поток - t1*/
       try {
           t1.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       t2.start();

       //Главный поток продолжит работу только после того, How t1 и t2 завершат работу
       try {
           t1.join();
           t2.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       System.out.println("Все потоки закончor работу, программа завершена");

   }
}
Simpleönekeý synp döretdik ThreadExample. Onuň wezipesi, işiň başlamagy barada ekranda habar görkezmek, soň 5 sekunt uklamak we ahyrynda işiň gutarandygy barada habar bermek. Çylşyrymly zat ýok. Esasy logika synpda bar Main. Teswirlere serediň: usuly ulanyp, join()sapaklaryň ýerine ýetiriliş yzygiderliligini üstünlikli dolandyrýarys. Mowzugyň başyny ýadyňyzda bolsa, sapak meýilleşdiriji muny etdi. Olary öz islegi boýunça işe girizdi: her gezek başgaça. Bu ýerde usuly ulanyp, ilki sapagyň işe girizilmegini we ýerine ýetirilmegini t1, soň bolsa sapagyň t2we diňe şondan soň programmanyň ýerine ýetirilişiniň esasy sapagyny üpjün etdik. Öňe git. Hakyky programmalarda, käbir sapaklaryň ýerine ýetirilmegini kesmeli bolanyňyzda köplenç ýagdaýlara duşarsyňyz. Mysal üçin, sapagymyz işleýär, ýöne belli bir hadysanyň ýa-da şertiň ýerine ýetirilmegine garaşýar. Eger şeýle bolsa, ol saklanýar. Methodaly usul bar bolsa, belki mantykly bolardy stop(). Emma, ​​hemme zat beýle bir ýönekeý däl. Bir wagtlar Thread.stop()Java-da bir usul bar bolup, sapagyň işini kesmäge mümkinçilik berýärdi. Emma soňra Java kitaphanasyndan aýryldy. Oracle resminamalarynda gözläp bilersiňiz we onuň könelişen diýip bellenendigini görüp bilersiňiz . Näme üçin? Sebäbi goşmaça iş bolmazdan akymy togtatdy. Mysal üçin, bir sapak maglumatlar bilen işläp, içindäki bir zady üýtgedip biler. stop()Soň birden işiň ortasynda birden kowuldy - bu-da boldy. Dogry ýapylmady, çeşmeler boşadylmady, hatda ýalňyşlyk bilen işlenmedi - bularyň hiç biri-de bolmady. Bu usul stop(), ulaltmak üçin öz ýolundaky ähli zady ýok etdi. Onuň işleýşini, kompýuteriň öçürilmegi üçin rozetkadan wilkany nädip çykarýandygy bilen deňeşdirip bolar. Hawa, islenýän netijäni gazanyp bilersiňiz. Everyoneöne her kim bir-iki hepdäniň içinde kompýuteriň munuň üçin “sag bol” diýmejekdigine düşünýär. Şol sebäpli Java-da sapaklary kesmek logikasy üýtgedildi, indi ýörite usul ulanylýar - interrupt().

Thread.interrupt () usuly

Bir sapakda bir usul diýseňiz näme bolýar interrupt()? 2 wariant bar:
  1. Eger obýekt şol pursatda garaşýan ýagdaýynda bolsa, joinýa-da sleepgaraşmak kesiler we programma zyňylar InterruptedException.
  2. Eger sapak şol pursatda işleýän bolsa, obýektiň baýdak baýdagy goýlar interrupted.
Emma obýektiň bu baýdagyň gymmatyny barlamaly we işi dogry tamamlamaly bolarys! Bu maksat bilen synpyň Threadaýratyn usuly bar - boolean isInterrupted(). Esasy kurs leksiýasyndan sagat mysalyna gaýdyp geleliň. Amatlylyk üçin birneme ýönekeýleşdirildi:
public class Clock extends Thread {

   public static void main(String[] args) throws InterruptedException {
       Clock clock = new Clock();
       clock.start();

       Thread.sleep(10000);
       clock.interrupt();
   }

   public void run() {
       Thread current = Thread.currentThread();

       while (!current.isInterrupted())
       {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               System.out.println("Работа потока была прервана");
               break;
           }
           System.out.println("Tik");
       }
   }
}
Biziň ýagdaýymyzda sagat her sekuntda başlaýar we başlaýar. 10-njy sekuntda sagat akymyny kesýäris. Öňden bilşiňiz ýaly, kesjek bolýan sapagymyz garaşmagyň birinde bolsa, bu netije berýär InterruptedException. Bu kadadan çykma görnüşi barlanylan kadadan çykma, şonuň üçin ony aňsatlyk bilen tutup bolýar we programmamyzy ýatyrmak logikasy ýerine ýetirilýär. Bu etdik. Ine, netijämiz: Tik Tik Tik Tik Tik Tik Tik Tik sapagyň işi kesildi. Bu synpyň esasy usullary bilen tanyşlygymyzy tamamlaýar Thread. Bilimleriňizi berkitmek üçin köp okalýan bu wideo leksiýany görüp bilersiňiz:
ajaýyp goşmaça material bolup hyzmat eder! Netijede, usullara umumy syn berlenden soň, kursda mundan beýläk näme geçjekdigimizi aýdýar :) Sag boluň!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION