KodeGym/Blog Jawa/Acak/Multithreading: Apa metode kelas Utas
John Squirrels
tingkat
San Francisco

Multithreading: Apa metode kelas Utas

Diterbitake ing grup
Hi! Dina iki kita bakal terus ngomong babagan multithreading. Ayo padha nliti kelas Utas lan apa sawetara cara. Nalika sinau metode kelas sadurunge, kita biasane mung nulis iki: <jeneng metode> -> <apa sing ditindakake metode>. Multithreading: Apa metode kelas Thread - 1Iki ora bisa digunakake karo Thread's cara :) Padha duwe logika liyane Komplek sing ora bakal bisa kanggo tokoh metu tanpa sawetara conto.

Metode Thread.start().

Ayo diwiwiti kanthi mbaleni awake dhewe. Minangka sampeyan bisa uga kelingan, sampeyan bisa nggawe thread kanthi nggawe kelas sampeyan warisan kelas Threadlan overriding run()cara. Nanging ora bakal miwiti dhewe, mesthi. Kanggo nindakake iki, kita nelpon metode obyek kita start(). Multithreading: Apa metode kelas Thread - 2Ayo kelingan conto saka wulangan sadurunge:
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("Thread executed: " + getName());
   }
}


public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
Cathetan: Kanggo miwiti thread, sampeyan kudu nelponstart()cara khusus tinimbangrun()cara! Iki minangka kesalahan sing gampang ditindakake, utamane nalika sampeyan miwiti sinau multithreading. Ing conto kita, yen sampeyan nelponrun()cara 10 kaping tinimbangstart(), sampeyan bakal njaluk iki:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
Deleng asil program kita: Utas dieksekusi: Utas-0 Utas wis dieksekusi: Utas-1 Utas wis dieksekusi: Utas-2 Utas wis dieksekusi: Utas-3 Utas wis dieksekusi: Utas-4 Utas dieksekusi: Utas-5 Utas dieksekusi: Utas-6 Utas dieksekusi: Utas-7 Utas dieksekusi: Utas-8 Utas sing dieksekusi: Utas-9 Deleng urutan output: Kabeh kedadeyan ing urutan sing sampurna. Aneh, ya? Kita ora biasa, amarga kita wis ngerti manawa urutan diwiwiti lan dieksekusi ditemtokake dening kapinteran sing unggul ing sistem operasi kita: penjadwal thread. Mungkin kita mung entuk begja? Mesthi, iki dudu babagan rejeki. Sampeyan bisa verifikasi iki kanthi mbukak program kaping pindho. Masalah iku sing nelpon ingrun()cara langsung ora ana hubungane karo multithreading. Ing kasus iki, program bakal dieksekusi ing utas utama, utas sing padha sing nglakokake main()metode kasebut. Iku mung sukses print 10 baris ing console lan iku. 10 utas durung diwiwiti. Dadi, elinga iki ing mangsa ngarep lan priksa dhewe. Yen sampeyan pengin run()cara disebut, nelpon start(). Ayo dadi luwih.

Metode Thread.sleep().

Kanggo nundha eksekusi utas saiki kanggo sawetara wektu, kita nggunakake sleep()metode kasebut. Multithreading: Apa metode kelas Thread - 3Cara kasebut sleep()njupuk sawetara milidetik minangka argumentasi, sing nuduhake jumlah wektu kanggo turu.
public class Main {

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

       long start = System.currentTimeMillis();

       Thread.sleep(3000);

       System.out.println(" - How long did I sleep? \n - " + ((System.currentTimeMillis()-start)) / 1000 + " seconds");

   }
}
Output konsol: - Suwene aku turu? - 3 detik Cathetan: cara sleep()iki statis: turu thread saiki. Yaiku, sing saiki dieksekusi. Punika titik penting liyane: thread turu bisa diselani. Ing kasus iki, program mbuwang InterruptedException. Kita bakal nimbang conto ing ngisor iki. Ngomong-ngomong, apa sing kedadeyan sawise thread tangi? Apa bakal terus dieksekusi saka ngendi dheweke mandheg? Ora. Sawise thread tangi, yaiku wektu liwati minangka argumen wis Thread.sleep()liwati, iku transisi menyang runnablenegara. Nanging, iki ora ateges manawa panjadwal thread bakal mbukak. Bisa uga menehi pilihan kanggo sawetara benang sing ora turu lan ngidini benang sing anyar kita tangi bisa nerusake karyane mengko. Elinga iki: tangi ora ateges terus kerja!

Metode Thread.join().

Multithreading: Apa metode kelas Thread - 4Cara iki join()nundha eksekusi utas saiki nganti utas liyane rampung. Yen kita duwe 2 Utas, t1lan t2, lan kita nulis
t1.join()
banjur t2ora bakal diwiwiti nganti t1rampung karyane. Cara kasebut join()bisa digunakake kanggo njamin urutan eksekusi benang. Ayo dipikirake cara join()cara kerjane ing conto ing ngisor iki:
public class ThreadExample extends Thread {

   @Override
   public void run() {

       System.out.println("Thread started: " + getName());

       try {
           Thread.sleep(5000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("Thread " + getName() + " is finished.");
   }
}


public class Main {

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

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

       t1.start();


 /* The second thread (t2) will start running only after the first thread (t1)
       is finished (or an exception is thrown) */
       try {
           t1.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       t2.start();

       // The main thread will continue running only after t1 and t2 have finished
       try {
           t1.join();
           t2.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       System.out.println("All threads have finished. The program is finished.");

   }
}
Kita nggawe kelas prasaja ThreadExample. Tugase yaiku nampilake pesen yen thread wis diwiwiti, turu sajrone 5 detik, lan pungkasane laporan yen karya wis rampung. Piece saka jajan. Logika utama ana ing Mainkelas. Deleng komentar: kita nggunakake join()cara kanggo sukses ngatur urutan eksekusi utas. Yen sampeyan ngelingi carane kita miwiti topik iki, urutan eksekusi ditangani dening panjadwal thread. Iku mbukak Utas ing discretion dhewe: saben wektu ing cara sing beda. Ing kene kita nggunakake cara kanggo njamin yen t1thread bakal diwiwiti lan dieksekusi dhisik, banjurt2thread, lan mung sawise iku utas utama program bakal terus. Ngalih. Ing program nyata, sampeyan bakal kerep nemokake kahanan nalika sampeyan kudu ngganggu eksekusi thread. Contone, thread kita mlaku, nanging ngenteni acara utawa kondisi tartamtu. Yen kedadeyan, benang kasebut mandheg. Mesthi wae yen ana sawetara stop()cara. Nanging ora dadi prasaja. Ing jaman biyen, Jawa pancen duwe Thread.stop()cara lan ngidini thread bisa diselani. Nanging banjur dibusak saka perpustakaan Jawa. Sampeyan bisa nemokake iku ing dokumentasi Oracle lan ndeleng sing wis ditandhani minangka deprecated. Kenging punapa? Amarga mung mungkasi thread tanpa nindakake apa-apa. Contone, thread bisa digunakake karo data lan ngganti soko. Banjur ing tengah-tengah pakaryan kasebut tiba-tiba lan ora sengaja dipotong kanthi stop()cara. Tanpa mateni sing tepat, utawa ngeculake sumber daya, malah ora bisa ngatasi kesalahan - ora ana apa-apa. Kanggo exaggerate rada, stop()cara mung numpes kabeh ing sawijining cara. Iku kaya narik kabel daya saka stopkontak kanggo mateni komputer. Ya, sampeyan bisa entuk asil sing dikarepake. Nanging kabeh wong ngerti yen sawise sawetara minggu komputer ora bakal matur nuwun kanggo nambani kaya ngono. Mulane logika interrupting thread diganti ing Jawa lan saiki nggunakake interrupt()cara khusus.

Metode Thread.interrupt().

Apa sing kedadeyan yen interrupt()metode kasebut diarani benang? Ana 2 kemungkinan:
  1. Yen obyek ana ing negara nunggu, contone, amarga cara joinutawa sleep, banjur Enteni bakal diselani lan program bakal uncalan InterruptedException.
  2. Yen thread ana ing negara fungsi, banjur interruptedgendéra boolean bakal disetel ing obyek.
Nanging kita kudu mriksa nilai gendera iki ing obyek kasebut lan ngrampungake karya kasebut kanthi bener! Mulane Threadkelas duwe boolean isInterrupted()metode. Ayo bali menyang conto jam sing ana ing pawulangan ing kursus dhasar. Kanggo penak, kita wis nyederhanakake rada:
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("The thread was interrupted");
               break;
           }
           System.out.println("Tick");
       }
   }
}
Ing kasus iki, jam diwiwiti lan wiwit obah saben detik. Ing detik kaping 10, kita ngganggu benang jam. Kaya sing wis dingerteni, yen utas sing kita coba interupsi ana ing salah sawijining negara nunggu, asile yaiku InterruptedException. Iki minangka pangecualian sing dicenthang, supaya kita bisa gampang nyekel lan nglakokake logika kanggo ngrampungake program kasebut. Lan mung sing kita lakoni. Mangkene asile: Tick Tick Tick Tcik Tick Tick Tick Tick Utas diselani Iki nyimpulake pambuka kanggo Threadmetode sing paling penting ing kelas. Sugeng enjang!
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar