Masalah sing dirampungake karo multithreading ing Jawa
Intine, multithreading Jawa diciptakake kanggo ngrampungake rong masalah utama:-
Nindakake sawetara tumindak bebarengan.
Ing conto ing ndhuwur, macem-macem benang (yaiku anggota kulawarga) nindakake sawetara tumindak kanthi podo karo: ngumbah piring, menyang toko, mbungkus barang.
Conto liyane "programmer" bisa diwenehi. Mbayangno yen sampeyan duwe program karo antarmuka panganggo. Nalika tombol Terusake diklik, sawetara petungan kudu kedadeyan ing program kasebut, lan pangguna kudu ndeleng layar antarmuka ing ngisor iki. Yen tumindak kasebut ditindakake kanthi urutan, sawise ngeklik tombol "Terusake", program kasebut mung bakal beku. Pangguna bakal weruh layar sing padha karo tombol "Terusake" nganti kabeh petungan internal rampung lan program tekan bagean ing ngendi antarmuka bakal digambar.
Inggih, ayo ngenteni sawetara menit!
Kita uga bisa nggawe maneh program kita, utawa, kaya sing diucapake para programer, "paralel." Ayo petungan perlu dileksanakake ing siji thread, lan antarmuka Rendering ing liyane. Umume komputer duwe sumber daya sing cukup kanggo iki. Ing kasus iki, program kasebut ora bakal "bodho", lan pangguna bakal tenang ing antarane layar antarmuka tanpa kuwatir babagan apa sing kedadeyan ing njero. Iku ora ngganggu :)
-
Nyepetake petungan.
Kabeh luwih prasaja ing kene. Yen prosesor kita duwe sawetara inti, lan paling prosesor saiki multi-inti, dhaptar tugas bisa ditanggulangi kanthi podo karo sawetara inti. Temenan, yen kita kudu ngatasi 1000 masalah lan saben wong wis ditanggulangi ing detik, siji inti bakal ngrampungake karo dhaftar ing 1000 detik, loro intine ing 500 detik, telu mung liwat 333 detik, lan ing.
Thread
. Yaiku, kanggo nggawe lan mbukak 10 utas, sampeyan butuh 10 obyek saka kelas iki. Ayo nulis conto sing paling gampang:
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("I'm Thread! My name is " + getName());
}
}
Kanggo nggawe lan ngluncurake utas, kita kudu nggawe kelas lan entuk warisan saka file java.lang
. Thread
lan ngganti cara ing run()
. Sing terakhir penting banget. Ing cara run()
kita nemtokake logika sing kudu ditindakake thread kita. Saiki, yen kita nggawe conto MyFirstThread
lan mbukak, cara kasebut run()
bakal nyithak baris kanthi jeneng menyang konsol: cara kasebut getName()
nyithak jeneng "sistem" benang, sing ditugasake kanthi otomatis. Senajan, bener, kok "yen"? Ayo nggawe lan nyoba!
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
Output konsol: Aku Utas! Jenengku Utas-2 Aku Utas! Jenengku Utas-1 Aku Utas! Jenengku Utas-0 Aku Utas! Jenengku Thread-3 I'm Thread! Jenengku Thread-6 I'm Thread! Jenengku Thread-7 I'm Thread! Jenengku Thread-4 I'm Thread! Jenengku Thread-5 I'm Thread! Jenengku Thread-9 Aku Thread! Jenengku Utas-8 Kita nggawe 10 utas (obyek) MyFirstThread
sing diwarisake Thread
lan diluncurake kanthi nelpon metode obyek start()
. Sawise nelpon metode , start()
metode kasebut wiwit bisa digunakake run()
, lan logika sing ditulis ing kana dieksekusi. Wigati dimangerteni: jeneng thread ora urut. Pancen aneh, kok padha ora dieksekusi kanthi giliran: Thread-0
, Thread-1
, Thread-2
lan liya-liyane? Iki persis conto nalika standar, "urutan" pikiran ora bakal bisa. Kasunyatane, ing kasus iki, kita mung ngetokake perintah kanggo nggawe lan ngluncurake 10 utas. Ing urutan apa sing kudu diluncurake diputusake dening scheduler thread: mekanisme khusus ing sistem operasi. Carane persis iku wis kabentuk lan ing asas apa iku nggawe pancasan iku topik banget Komplek, lan kita ora bakal nyilem menyang saiki. Wangsulan: Bab ingkang utama kanggo elinga iku programmer ora bisa ngontrol urutan eksekusi thread. Kanggo ngerteni seriuse kahanan kasebut, coba gunakake cara main()
saka conto ing ndhuwur kaping pindho. Output konsol kapindho: Aku Utas! Jenengku Utas-0 Aku Utas! Jenengku Thread-4 I'm Thread! Jenengku Thread-3 I'm Thread! Jenengku Utas-2 Aku Utas! Jenengku Utas-1 Aku Utas! Jenengku Thread-5 I'm Thread! Jenengku Thread-6 I'm Thread! Jenengku Utas-8 Aku Utas! Jenengku Thread-9 Aku Thread! Jenengku Thread-7 Output konsol Katelu: Aku Utas! Jenengku Utas-0 Aku Utas! Jenengku Thread-3 I'm Thread! Jenengku Utas-1 Aku Utas! Jenengku Utas-2 Aku Utas! Jenengku Thread-6 I'm Thread! Jenengku Thread-4 I'm Thread! Jenengku Thread-9 Aku Thread! Jenengku Thread-5 I'm Thread! Jenengku Thread-7 I'm Thread! Jenengku Thread-8
Masalah sing nggawe multithreading
Ing conto karo buku, sampeyan weruh manawa multithreading ngrampungake masalah sing cukup penting, lan panggunaane nyepetake karya program kita. Ing akeh kasus - kaping pirang-pirang. Nanging ora kanggo apa-apa sing multithreading dianggep topik Komplek. Sawise kabeh, yen digunakake kanthi ora bener, bakal nggawe masalah tinimbang ngrampungake. Nalika aku ngomong "nggawe masalah," Aku ora ateges soko abstrak. Ana rong masalah khusus sing bisa nyebabake multithreading: deadlock lan kondisi balapan. Deadlock minangka kahanan nalika pirang-pirang utas nunggu sumber daya sing dikuwasani saben liyane, lan ora ana sing bisa nerusake eksekusi. Kita bakal pirembagan liyane babagan iki ing ceramah mangsa, nanging saiki conto iki bakal cukup: Mbayangno sing thread-1 nggarap sawetara Obyek-1, lan thread-2 nggarap Object-2. Program kasebut ditulis kaya mangkene:- Utas-1 bakal mandheg nggarap Obyek-1 lan ngalih menyang Obyek-2 sanalika Utas-2 mandheg nggarap Obyek 2 lan ngalih menyang Obyek-1.
- Utas-2 bakal mandheg nggarap Obyek-2 lan ngalih menyang Obyek-1 sanalika Utas-1 mandheg nggarap Obyek 1 lan ngalih menyang Obyek-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();
}
}
}
Saiki bayangake manawa program kasebut tanggung jawab kanggo operasi robot sing nyiapake panganan! Utas-0 njupuk endhog saka kulkas. Stream 1 nguripake kompor. Stream-2 njupuk wajan lan dilebokake ing kompor. Stream 3 murub geni ing kompor. Stream 4 pour lenga menyang telusur. Stream 5 pecah endhog lan pour menyang wajan. Stream 6 mbuwang cangkang menyang tong sampah. Stream-7 mbusak endhog scrambled sing wis rampung saka panas. Potok-8 nyelehake endhog orak-arik ing piring. Stream 9 ngumbah piring. Deleng asil program kita: Utas-0 dieksekusi Utas-2 Utas dieksekusi Utas-1 Utas dieksekusi Utas-4 Utas dieksekusi Utas-9 Utas dieksekusi Utas-5 Utas dieksekusi Utas-8 Utas dieksekusi Utas-7 Utas dieksekusi Utas-7 Utas dieksekusi -3 Utas-6 Utas dieksekusi. Apa skrip kasebut nyenengake? :) Lan kabeh amarga operasi program kita gumantung saka urutan thread sing dieksekusi. Ing nglanggar slightest saka urutan, pawon kita dadi neraka, lan robot dadi edan numpes kabeh watara. Iki uga masalah umum ing program multithreaded, sing bakal krungu bab luwih saka sapisan. Ing pungkasan kuliah, aku arep menehi rekomendasi buku babagan multithreading.
GO TO FULL VERSION