JavaRush /Блоги Java /Random-TG /Multithreading: Усулҳои Синфи Thread чӣ кор мекунанд

Multithreading: Усулҳои Синфи Thread чӣ кор мекунанд

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо сӯҳбатро дар бораи чанд ришта идома медиҳем. Биёед ба синфи Thread ва чӣ гуна кор кардани якчанд усулҳои он назар андозем. Пештар, вақте ки мо усулҳои синфро меомӯхтем, мо аксар вақт онро чунин менавиштем: "номи усул" -> "он чӣ кор мекунад."
Multithreading: усулҳои синфи Thread чӣ кор мекунанд - 1
Ин бо усулҳои Thread кор намекунад :) Мантиқи онҳо мураккабтар аст ва бидуни чанд мисол фаҳмидан ғайриимкон аст.

Усули Thread.start().

Биёед бо такрор оғоз кунем. Тавре ки шумо эҳтимол дар ёд доред, шумо метавонед тавассути мерос гирифтани синфи худ аз синф Threadва барҳам додани усули дар он ришта эҷод кунед run(). Аммо, албатта, он худ аз худ оғоз намекунад. Барои ин, мо методро дар an objectи худ даъват мекунем start(). Multithreading: усулҳои синфи Thread чӣ кор мекунанд - 2Мисоли лекцияи пешинаро ба хотир меорем:
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();
       }
   }
}
Лутфан таваҷҷӯҳ намоед: барои оғози ришта, шумо бояд усули махсусро даъват кунедstart(), наrun()! Ин як хатои осон аст, махсусан ҳангоми бори аввал омӯхтани чанд ришта. Агар дар мисоли мо шумо усули an objectроrun()ба ҷоиstart(), натиҷа чунин хоҳад буд:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
Ришта-0 иҷро карда шуд Thread-1 ришта иҷро шуд Thread-2 иҷро карда шуд Thread-3 executive Thread-4 венти иҷрошуда Thread-5 executed Thread-6 сетче иҷро шуд Thread-7 сет иҷро Thread-8 Thread-9 иҷро карда шуд. Ба пайдарҳамии баромад нигаред: ҳама чиз ба таври қатъӣ ба тартиб медарояд. Аҷиб, дуруст? Мо ба ин одат накардаем, зеро мо аллакай медонем, ки тартиби оғоз ва иҷро кардани риштаҳо аз ҷониби суперразведка дар дохor системаи оператсионии мо - нақшаи ришта муайян карда мешавад. Шояд ман танҳо хушбахт будам? Албатта, ин кори бахт нест. Шумо метавонед инро тавассути иҷро кардани барнома якчанд маротиба тафтиш кунед. Гап дар он аст, ки даъват кардани метод мустақиманrun()бо чанд ришта ҳеҷ иртиботе надорад. Дар ин ҳолат, барнома дар риштаи асосӣ иҷро карда мешавад - оне, ки дар он усул иҷро карда мешавадmain(). Он танҳо 10 сатрро пайдарпай ба консол мебарорад ва тамом. Ягон 10 ришта оғоз намешавад. Аз ин рӯ, барои оянда дар хотир доред ва ҳамеша худро тафтиш кунед. Агар шумо хоҳед, ки ин корро анҷом диҳедrun(), ба он занг занедstart(). Биёед пеш равем.

Усули Thread.sleep().

Барои муддате таваққуф кардани иҷрои риштаи ҷорӣ, истифода баред sleep(). Multithreading: усулҳои синфи Thread чӣ кор мекунанд - 3Усул sleep()ҳамчун параметр шумораи миллисонияҳоро мегирад, яъне вақти ба хоб гузоштани ришта.
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 + " секунды");

   }
}
Баромади консол: - Ман чанд вақт хоб кардам? - 3 сония Лутфан қайд кунед: усул sleep()статикӣ аст: он риштаи ҷорӣро ба хоб мегузорад. Яъне он кас, ки дар айни замон кор мекунад. Боз як нюанси муҳим: ҷараён дар ҳолати хоб метавонад қатъ карда шавад. Дар ин ҳолат, дар барнома истисно рӯй медиҳад InterruptedException. Мо як мисолро дар зер дида мебароем. Воқеан, пас аз «бедор шудан» ришта чӣ мешавад? Оё он фавран иҷрои худро аз ҷое, ки монда буд, идома медиҳад? Не. Пас аз бедор шудани ришта - вақте ки вақт ҳамчун аргумент ба охир мерасад Thread.sleep()- он ба ҳолати иҷрошаванда ворид мешавад . Аммо, ин маънои онро надорад, ки ҷадвалбандии ришта онро иҷро мекунад. Комилан мумкин аст, ки ба ягон риштаи дигари «нохоб»-и дигар афзалтар гузорад ва риштаи «нав бедор»-и мо каме дертар корашро идома диҳад. Ҳатман дар хотир доред: "бедор шудан маънои идома додани корро дар ҳамон лаҳза надорад!"

Усули Thread.join().

Multithreading: усулҳои синфи Thread чӣ кор мекунанд - 4Усул join()иҷрои риштаи ҷорӣро то анҷоми риштаи дигар бозмедорад. Агар мо 2 ришта дошта бошем, t1ва t2, ва мо менависем -
t1.join()
t2то t1 кори худро ба охир нарасонад, ба кор шуруъ намекунад. Ин усулро join()барои таъмини пайдарпайии иҷрои риштаҳо истифода бурдан мумкин аст. Биёед join()бо истифода аз мисол ба кор назар андозем:
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 работу, программа завершена");

   }
}
Мо як синфи оддӣ сохтаем ThreadExample. Вазифаи он аз он иборат аст, ки дар экран дар бораи оғози кор хабар нишон дода, баъд 5 сония хоб равад ва дар охир дар бораи анҷоми кор хабар диҳад. Ҳеҷ чиз мураккаб нест. Мантиқи асосӣ дар синф мавҷуд аст Main. Ба шарҳҳо нигаред: бо истифода аз усул, join()мо пайдарпайии иҷрои риштаҳоро бомуваффақият назорат мекунем. Агар шумо ибтидои мавзӯъро дар хотир дошта бошед, нақшасози ришта ин корро кард. Ӯ онҳоро бо ихтиёри худ оғоз кард: ҳар дафъа ба таври гуногун. Дар ин ҷо, бо истифода аз усул, мо кафолат додем, ки аввал ришта оғоз ва иҷро карда мешавад t1, баъд ришта t2ва танҳо баъд аз онҳо риштаи асосии иҷрои барнома. Ба пеш. Дар барномаҳои воқеӣ, шумо аксар вақт бо ҳолатҳое дучор мешавед, ки ба шумо лозим аст, ки иҷрои баъзе риштаҳоро қатъ кунед. Масалан, риштаи мо ҷараён дорад, аммо интизори иҷро шудани ҳодиса ё шарти муайян аст. Агар ин рӯй диҳад, он қатъ мешавад. Эҳтимол мантиқӣ мебуд, агар ягон усуле мисли stop(). Бо вуҷуди ин, ҳама чиз он қадар оддӣ нест. Замоне Thread.stop()дар Java усуле вуҷуд дошт ва ба шумо имкон дод, ки кори риштаро қатъ кунед. Аммо баъдтар он аз китобхонаи Java хориҷ карда шуд. Шумо метавонед онро дар ҳуҷҷатҳои Oracle ҷустуҷӯ кунед ва бубинед, ки он ҳамчун бекоршуда қайд шудааст . Чаро? Зеро вай бе ягон кори иловагй раф-тро бас кард. Масалан, ришта метавонад бо маълумот кор кунад ва чизеро дар он тағир диҳад. stop()Баъд дар байни кор ногахон уро нокаут карданд — хамин тавр шуд. Ҳеҷ гуна қатъкунии дуруст, озодкунии захираҳо, ҳатто коркарди хатогӣ вуҷуд надошт - ҳеҷ яке аз ин рӯй надодааст. Усули stop()муболиға кардан, ҳама чизро дар роҳи худ нобуд кард. Фаъолияти онро метавон бо он муқоиса кард, ки чӣ гуна касе симро аз розетка кашида, компютерро хомӯш мекунад. Бале, шумо метавонед ба натиҷаи дилхоҳ ноил шавед. Аммо ҳама мефаҳманд, ки пас аз ду ҳафта компютер барои ин "ташаккур" намегӯяд. Аз ин сабаб мантиқи қатъи риштаҳо дар Java тағир дода шуд ва ҳоло усули махсус истифода мешавад - interrupt().

Усули Thread.interrupt().

Агар шумо методро дар ришта даъват кунед, чӣ мешавад interrupt()? 2 вариант вуҷуд дорад:
  1. Агар an object дар он лаҳза дар ҳолати интизорӣ қарор дошта бошад, масалан, joinё sleep, интизорӣ қатъ мегардад ва барнома InterruptedException.
  2. Агар ришта дар он лаҳза дар ҳолати корӣ бошад, парчами логикии an object гузошта мешавад interrupted.
Аммо ба мо лозим меояд, ки an objectро ба кадри ин байрак санчида, худамон корро дуруст анчом дихем! Бо ин максад дар синф Threadусули махсус — boolean isInterrupted(). Биёед ба мисоли соат аз лексияи курси асосӣ баргардем. Барои роҳат, он каме содда карда шудааст:
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");
       }
   }
}
Дар мо бошад, акрабаки соат дар хар сония сар мешавад ва ба нишон мерасад. Дар сонияи 10-ум мо ҷараёни соатро қатъ мекунем. Тавре ки шумо аллакай медонед, агар риштае, ки мо онро қатъ карданӣ ҳастем, дар яке аз ҳолати интизорӣ қарор дошта бошад, ин боиси InterruptedException. Ин намуди истисно истиснои тафтишшуда аст, бинобар ин онро ба осонӣ дастгир кардан мумкин аст ва мантиқи қатъи барномаи мо иҷро карда мешавад. Мо ин корро кардем. Ин аст натиҷаи мо: Tik Tik Tik Tik Tik Tik Tik Tik Tik Tik Tik Кори ришта қатъ шуд.Ин муқаддимаи моро ба усулҳои асосии синф ба анҷом мерасонад Thread. Барои мустаҳкам кардани донишҳои худ, шумо метавонед ин видеолексияи видеоиро дар бораи чанд ришта тамошо кунед:
он ҳамчун маводи аълои иловагӣ хизмат хоҳад кард! Дар охир, пас аз шарҳи усулҳо, он аниқ мегӯяд, ки мо дар ин курс чӣ гуна хоҳем гузашт :) Барори кор!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION