JavaRush /Java Blogu /Random-AZ /Multithreading: Thread Class Methods nə edir

Multithreading: Thread Class Methods nə edir

Qrupda dərc edilmişdir
Salam! Bu gün biz multithreading haqqında danışmağa davam edirik. Thread sinfinə və onun bir neçə metodunun necə işlədiyinə nəzər salaq. Əvvəllər, biz sinif metodlarını öyrənərkən, biz bunu çox vaxt belə yazırdıq: “metodun adı” -> “nə edir”.
Multithreading: Thread sinfinin metodları nə edir - 1
Bu Thread metodları ilə işləməyəcək :) Onların məntiqi daha mürəkkəbdir və bir neçə misal olmadan başa düşmək mümkün deyil.

Thread.start() metodu

Təkrardan başlayaq. Yəqin ki, xatırladığınız kimi, sinifinizi sinifdən miras alaraq Threadvə içindəki metodu ləğv etməklə mövzu yarada bilərsiniz run(). Ancaq təbii ki, bu, öz-özünə başlamayacaq. Bunun üçün obyektimizdəki metodu çağırırıq start(). Multithreading: Thread sinfinin metodları nə edir - 2Əvvəlki mühazirədən nümunəni xatırlayaq:
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();
       }
   }
}
Diqqət edin: mövzu açmaq üçün xüsusi metodu çağırmalısınızstart(),run()! Bu, xüsusilə çox iş parçacığını ilk dəfə öyrənərkən etmək asan bir səhvdir. Nümunəmizdərun()əvəzinəstart(), nəticə belə olacaq:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
Mövzu-0 mövzu icra edildi Mövzu-1 mövzu icra edildi Mövzu-2 mövzu icra edildi Mövzu-3 mövzu icra edildi Mövzu-4 mövzu icra edildi Mövzu-5 mövzu icra edildi Mövzu-6 mövzu icra edildi Mövzu-7 mövzu icra edildi Mövzu-8 mövzu icra edildi Mövzu-9 mövzu icra edildi Çıxış ardıcıllığına baxın: hər şey ciddi qaydada gedir. Qəribə, elə deyilmi? Biz buna öyrəşməmişik, çünki artıq bilirik ki, iplərin işə salınması və icrası ardıcıllığı bizim əməliyyat sistemimizin daxilində olan super intellekt - thread planlayıcısı tərəfindən müəyyən edilir. Bəlkə sadəcə şanslı idim? Təbii ki, bu bəxt məsələsi deyil. Bunu proqramı bir neçə dəfə işə salmaqla yoxlaya bilərsiniz. Məsələ ondadır ki, metodu birbaşa çağırmağınrun()multithreading ilə heç bir əlaqəsi yoxdur. Bu halda, proqram əsas mövzuda yerinə yetiriləcək - metodun icra edildiyi birmain(). O, sadəcə olaraq konsola ardıcıl olaraq 10 sətir çıxaracaq və bu qədər. 10 mövzu başlamayacaq. Buna görə də gələcək üçün xatırlayın və özünüzü daim yoxlayın. Əgər bunu etmək istəyirsinizsərun(), zəng edinstart(). Gəlin davam edək.

Thread.sleep() metodu

Cari mövzunun icrasını bir müddət dayandırmaq üçün istifadə edin sleep(). Multithreading: Thread sinfinin metodları nə edir - 3Metod sleep()parametr kimi millisaniyələrin sayını, yəni ipin yuxu rejiminə salınması lazım olan vaxtı alır.
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 çıxışı: - Nə qədər yatmışam? - 3 saniyə Diqqət edin: metod sleep()statikdir: cari ipi yuxu rejiminə qoyur. Yəni, hazırda işləyən. Başqa bir vacib nüans: yuxu vəziyyətində axın kəsilə bilər. Bu vəziyyətdə proqramda bir istisna baş verəcəkdir InterruptedException. Aşağıda bir nümunəyə baxacağıq. Yeri gəlmişkən, mövzu "oyandıqdan" sonra nə baş verir? Dərhal qaldığı yerdən icrasına davam edəcəkmi? Yox. Mövzu oyandıqdan sonra - arqument kimi keçən vaxt başa çatdıqda Thread.sleep()- işlək vəziyyətə daxil olur . Lakin bu, mövzu planlaşdırıcısının onu işlədəcəyi demək deyil. Tamamilə mümkündür ki, o, hansısa başqa “yatmayan” ipə üstünlük versin və “təzə oyanmış” ipimiz bir az sonra işləməyə davam edəcək. Unutmayın: "oyanmaq elə o saniyə işləməyə davam etmək demək deyil!"

Thread.join() metodu

Multithreading: Thread sinfinin metodları nə edir - 4Metod, join()başqa bir başlıq tamamlanana qədər cari ipin icrasını dayandırır. 2 mövzumuz varsa, t1t2, və yazacağıq -
t1.join()
t2t1 öz işini tamamlayana qədər işə başlamayacaq. Metod join()iplərin icra ardıcıllığını təmin etmək üçün istifadə edilə bilər. join()Bir nümunədən istifadə edərək işə baxaq :
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 работу, программа завершена");

   }
}
Biz sadə bir sinif yaratdıq ThreadExample. Onun vəzifəsi işin başlanması barədə ekranda bir mesaj göstərmək, sonra 5 saniyə yuxuya getmək və sonunda işin başa çatması barədə məlumat verməkdir. Mürəkkəb bir şey yoxdur. Əsas məntiq sinifdə var Main. Şərhlərə baxın: metoddan istifadə edərək, join()iplərin icra ardıcıllığını uğurla idarə edirik. Mövzunun əvvəlini xatırlayırsınızsa, mövzu planlayıcısı bunu etdi. Onları öz istəyi ilə işə saldı: hər dəfə fərqli şəkildə. Burada, metoddan istifadə edərək, əvvəlcə ipin işə salınmasını və icrasını təmin etdik t1, sonra mövzu t2, və yalnız onlardan sonra proqramın icrasının əsas mövzusu. Davam et. Həqiqi proqramlarda tez-tez bəzi mövzuların icrasını dayandırmaq lazım olan vəziyyətlərlə qarşılaşacaqsınız. Məsələn, mövzumuz işləyir, lakin müəyyən bir hadisə və ya şərtin yerinə yetirilməsini gözləyir. Bu baş verərsə, dayanar. kimi bir üsul olsaydı, yəqin ki, məntiqli olardı stop(). Bununla belə, hər şey o qədər də sadə deyil. Bir zamanlar Thread.stop()Java-da həqiqətən mövcud olan bir metod var idi və sizə ipin işini dayandırmağa imkan verirdi. Lakin sonradan Java kitabxanasından silindi. Siz onu Oracle sənədlərində axtara və onun köhnəlmiş kimi qeyd olunduğunu görə bilərsiniz . Niyə? Çünki heç bir əlavə iş görmədən sadəcə olaraq axını dayandırdı. Məsələn, mövzu verilənlərlə işləyə və içindəki nəyisə dəyişə bilər. Sonra işin ortasında qəflətən döyüldü stop()- vəssalam. Düzgün bağlanma, resursların boşaldılması, hətta səhvlərin idarə edilməsi yox idi - bunların heç biri baş vermədi. Metod stop(), şişirtmək üçün, yolundakı hər şeyi sadəcə məhv etdi. Onun işini kiminsə kompüteri söndürmək üçün rozetkadan fişini çəkməsi ilə müqayisə etmək olar. Bəli, istədiyiniz nəticəni əldə edə bilərsiniz. Ancaq hamı başa düşür ki, bir neçə həftədən sonra kompüter bunun üçün "sağ ol" deməyəcək. Bu səbəbdən Java-da mövzuların kəsilməsinin məntiqi dəyişdirildi və indi xüsusi üsuldan istifadə olunur - interrupt().

Thread.interrupt() metodu

Mövzuda metodu çağırsanız nə olar interrupt()? 2 variant var:
  1. Əgər obyekt həmin anda gözləmə vəziyyətində idisə, məsələn, joinvə ya sleep, gözləmə dayandırılacaq və proqram atacaq InterruptedException.
  2. Əgər ip həmin anda işlək vəziyyətdə idisə, obyektin boolean bayrağı qurulacaq interrupted.
Amma biz bu bayrağın dəyərinə obyekti yoxlamalı və işi özümüz düzgün başa çatdırmalı olacağıq! Bu məqsədlə sinfin Threadxüsusi metodu var - boolean isInterrupted(). Əsas kurs mühazirəsindən saat nümunəsinə qayıdaq. Rahatlıq üçün bir qədər sadələşdirilmişdir:
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");
       }
   }
}
Bizim vəziyyətimizdə saat hər saniyə başlayır və tıqqıltıya başlayır. 10-cu saniyədə saat axınını kəsirik. Artıq bildiyiniz kimi, kəsməyə çalışdığımız mövzu gözləmə vəziyyətlərindən birində olarsa, bu, ilə nəticələnir InterruptedException. Bu növ istisna yoxlanılmış istisnadır, ona görə də asanlıqla tutula bilər və proqramın dayandırılması məntiqimiz yerinə yetirilə bilər. Biz bunu etdik. Nəticəmiz budur: Tik Tik Tik Tik Tik Tik Tik Tik Tik Tik Tik Mövzunun işi dayandırıldı.Bu, sinfin əsas metodlarına girişimizi yekunlaşdırır Thread. Biliklərinizi möhkəmləndirmək üçün siz çoxilli oxuma haqqında bu video mühazirəyə baxa bilərsiniz:
əla əlavə material kimi xidmət edəcəkdir! Sonda metodlara ümumi baxışdan sonra kursda daha nələrdən keçəcəyimizi dəqiq deyir :) Uğurlar!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION