JavaRush /Blog Jawa /Random-JV /Multithreading: Apa Metode Kelas Utas Apa

Multithreading: Apa Metode Kelas Utas Apa

Diterbitake ing grup
Hello! Dina iki kita terus ngomong babagan multithreading. Ayo goleki kelas Utas lan cara kerjane sawetara metode. Sadurunge, nalika sinau metode kelas, kita paling kerep nulis kaya iki: "jeneng metode" -> "apa sing ditindakake."
Multithreading: apa metode kelas Thread - 1
Iki ora bakal bisa digunakake karo metode Utas :) Logika luwih rumit, lan tanpa sawetara conto ora bisa dingerteni.

Metode Thread.start().

Ayo diwiwiti kanthi pengulangan. Sampeyan bisa uga elinga, sampeyan bisa nggawe thread kanthi warisan kelas saka kelas Threadlan overriding cara ing run(). Nanging, mesthi, ora bakal diwiwiti dhewe. Kanggo nindakake iki, kita nelpon metode ing obyek kita start(). Multithreading: apa metode kelas Utas nindakake - 2Ayo elinga conto saka ceramah sadurunge:
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();
       }
   }
}
Wigati dimangerteni: kanggo miwiti thread, sampeyan kudu nelpon cara khususstart(), dudurun()! Iki minangka kesalahan sing gampang ditindakake, utamane nalika sinau multithreading. Yen ing conto sampeyan nelpon metode ing obyek 10 kapingrun()tinimbangstart(), asil bakal kaya iki:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
Utas-0 dieksekusi Utas-1 Utas dieksekusi Utas-2 Utas dieksekusi Utas-3 Utas dieksekusi Utas-4 Utas dieksekusi Utas-5 Utas dieksekusi Utas-6 Utas dieksekusi Utas-7 Utas dieksekusi Utas-8 Utas dieksekusi Utas-9 Utas dieksekusi Deleng ing urutan output: kabeh dadi strictly supaya. Aneh, ta? Kita ora digunakake kanggo iki, amarga kita wis ngerti yen urutan thread diluncurake lan dieksekusi ditemtokake dening superintelligence ing sistem operasi kita - panjadwal thread. Mungkin aku mung begja? Mesthi wae, ora ana rejeki. Sampeyan bisa verifikasi iki kanthi mbukak program kaping pindho. Intine yaiku nelpon metode langsungrun()ora ana hubungane karo multithreading. Ing kasus iki, program bakal dieksekusi ing utas utama - sing cara dieksekusimain(). Iku mung bakal output 10 baris sequentially kanggo console lan iku. Ora ana 10 utas sing bakal diwiwiti. Mulane, elinga kanggo masa depan lan tansah mriksa dhewe. Yen sampeyan pengin rampungrun(), nelponstart(). Ayo nerusake.

Metode Thread.sleep().

Kanggo ngaso eksekusi thread saiki kanggo sawetara wektu, gunakake sleep(). Multithreading: apa metode kelas Utas nindakake - 3Cara kasebut sleep()njupuk minangka parameter nomer milliseconds, yaiku, wektu sing kudu dilebokake kanggo turu.
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 + " секунды");

   }
}
Output konsol: - Suwene aku turu? - 3 detik Wigati dimangerteni: cara sleep()iki statis: nggawe thread saiki turu. Yaiku, sing saiki kerja. Nuansa penting liyane: aliran ing negara turu bisa diganggu. Ing kasus iki, pangecualian bakal kedadeyan ing program kasebut InterruptedException. Kita bakal ndeleng conto ing ngisor iki. Ngomong-ngomong, apa sing kedadeyan sawise thread "tangi"? Apa bakal langsung nerusake eksekusi saka ngendi dheweke mandheg? Ora. Sawise thread tangi-nalika wektu liwati minangka bantahan kanggo kadaluwarsa Thread.sleep()- iku lumebu ing runnable negara . Nanging, iki ora ateges manawa panjadwal thread bakal mbukak. Sampeyan bisa uga bakal menehi pilihan kanggo sawetara benang "ora turu" liyane, lan benang "mentas tangi" bakal terus digunakake mengko. Elinga: "tangi ora ateges terus kerja ing detik kasebut!"

Metode Thread.join().

Multithreading: apa metode kelas Utas nindakake - 4Cara iki join()nundha eksekusi utas saiki nganti utas liyane rampung. Yen kita duwe 2 utas, t1lan t2, lan kita nulis -
t1.join()
t2ora bakal miwiti kerja nganti t1 wis rampung. Cara kasebut join()bisa digunakake kanggo njamin urutan eksekusi benang. Ayo katon ing karya join()nggunakake conto:
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 работу, программа завершена");

   }
}
Kita wis nggawe kelas prasaja ThreadExample. Tugase yaiku nampilake pesen ing layar babagan wiwitan kerja, banjur turu sajrone 5 detik lan ing pungkasan ngandhani babagan rampung kerja. Ora ana sing rumit. Logika utama ana ing kelas Main. Deleng komentar: nggunakake metode kasebut, join()kita sukses ngontrol urutan eksekusi benang. Yen sampeyan ngelingi wiwitan topik, panjadwal thread nindakake iki. Dheweke ngluncurake kanthi kawicaksanan dhewe: beda saben wektu. Ing kene, nggunakake metode kasebut, kita mesthekake yen utas bakal diluncurake lan dieksekusi t1, banjur benang t2, lan mung sawise utas utama eksekusi program. Terusna. Ing program nyata, sampeyan bakal kerep nemoni kahanan nalika sampeyan kudu ngganggu eksekusi sawetara utas. Contone, thread kita mlaku, nanging ngenteni acara utawa kondisi tartamtu. Yen iki kedadeyan, mandheg. Mesthi logis yen ana sawetara cara kaya stop(). Nanging, kabeh ora dadi prasaja. Ing jaman biyen, ana cara Thread.stop()ing Jawa bener-bener ana lan ngidini sampeyan ngganggu karya thread. Nanging banjur dibusak saka perpustakaan Jawa. Sampeyan bisa ndeleng ing dokumentasi Oracle lan ndeleng manawa wis ditandhani minangka ora digunakake . Kenging punapa? Amarga iku mung mandheg aliran tanpa karya tambahan. Contone, thread bisa digunakake karo data lan ngganti soko ing. Banjur dheweke tiba-tiba dibuwang stop()ing tengah-tengah pakaryan - lan iki. Ora ana shutdown sing bener, ora ana sumber daya sing bisa dibebasake, malah ora ana kesalahan - ora ana sing kedadeyan. Cara stop(), kanggo exaggerate, mung numpes kabeh ing dalan. Operasi kasebut bisa dibandhingake karo carane wong narik plug saka soket kanggo mateni komputer. Ya, sampeyan bisa entuk asil sing dikarepake. Nanging kabeh wong ngerti yen ing sawetara minggu komputer ora bakal ngomong "matur nuwun" kanggo iki. Mulane, logika interrupting thread ing Jawa diganti, lan saiki cara khusus digunakake - interrupt().

Metode Thread.interrupt().

Apa sing kedadeyan yen sampeyan nelpon metode interrupt() ing thread ? Ana 2 pilihan:
  1. Yen obyek ana ing negara nunggu ing wayahe, contone, joinutawa sleep, nunggu bakal diselani lan program bakal uncalan InterruptedException.
  2. Yen utas ing wektu iku bisa digunakake, gendera boolean obyek bakal disetel interrupted.
Nanging kita kudu mriksa obyek kasebut kanggo regane bendera iki lan ngrampungake karya kasebut kanthi bener! Kanggo maksud iki, kelas Threadduwe cara khusus - boolean isInterrupted(). Ayo bali menyang conto jam saka kuliah kursus utama. Kanggo penak, rada disederhanakake:
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");
       }
   }
}
Ing kasus kita, jam wiwit lan wiwit ticking saben detik. Ing detik kaping 10 kita ngganggu aliran jam. Nalika sampeyan wis ngerti, yen thread kita nyoba kanggo ngganggu ing salah siji negara Enteni, iki asil ing InterruptedException. Pangecualian jinis iki minangka pangecualian sing dicenthang, supaya bisa gampang kejiret lan logika mandap program kita dieksekusi. Sing apa kita nindakake. Iki asil kita: Tik Tik Tik Tik Tik Tik Tik Tik Tik Utas diganggu Thread. Kanggo nggabungake kawruh, sampeyan bisa nonton video ceramah babagan multithreading iki:
bakal dadi bahan tambahan sing apik banget! Ing pungkasan, sawise ringkesan saka cara, iku ngandhani persis apa kita bakal pindhah liwat luwih ing Course :) Good luck!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION