Masalah ditanggulangi kanthi multithreading
Multithreading bener-bener diciptakake kanggo nggayuh rong tujuan penting:-
Nindakake sawetara perkara bebarengan.
Ing conto ing ndhuwur, macem-macem Utas (anggota kulawarga) nindakake sawetara tumindak ing podo karo: padha wisuh piring, tindak menyang toko, lan barang dikemas.
Kita bisa menehi conto sing luwih cedhak karo pemrograman. Upaminipun sampeyan duwe program karo antarmuka panganggo. Nalika sampeyan ngeklik 'Terus' ing program, sawetara petungan kudu kelakon lan pangguna kudu ndeleng layar ing ngisor iki. Yen tumindak kasebut ditindakake kanthi urut, program kasebut bakal mandheg sawise pangguna ngeklik tombol 'Terusake'. Pangguna bakal weruh layar kanthi layar tombol 'Terus' nganti program nindakake kabeh petungan internal lan tekan bagean ing ngendi antarmuka pangguna dianyari.
Inggih, kita bakal ngenteni sawetara menit!
Utawa kita bisa ngolah maneh program kita, utawa, kaya sing diucapake para programer, 'parallelize'. Ayo nindakake petungan ing siji utas lan tarik antarmuka pangguna ing liyane. Umume komputer duwe sumber daya sing cukup kanggo nindakake iki. Yen kita njupuk rute iki, program ora bakal beku lan pangguna bakal lancar ing antarane layar tanpa kuwatir apa sing kedadeyan ing njero. Sing siji ora ngganggu liyane :)
-
Nindakake petungan luwih cepet.
Kabeh luwih prasaja ing kene. Yen prosesor kita duwe sawetara intine, lan umume prosesor saiki, mula sawetara intine bisa nangani dhaptar tugas kanthi podo karo. Temenan, yen kita kudu nindakake 1000 tugas lan saben njupuk siji detik, siji inti bisa rampung dhaftar ing 1000 detik, loro intine ing 500 detik, telu ing sethitik luwih saka 333 detik, etc.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("I'm Thread! My name is " + getName());
}
}
Kanggo nggawe lan mbukak Utas, kita kudu nggawe kelas, nggawe warisan java.lang . Kelas thread , lan timpa cara run () sawijining . Syarat pungkasan iku penting banget. Ing cara roto () kita nemtokake logika kanggo thread kita kanggo nglakokaké. Saiki, yen kita nggawe lan mbukak conto MyFirstThread , cara run () bakal nampilake baris kanthi jeneng: metode getName () nampilake jeneng 'sistem' thread, sing ditugasake kanthi otomatis. Nanging kenapa kita ngomong kanthi tentatif? Ayo nggawe siji lan temokake!
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 Ayo nggawe 10 Utas ( obyek MyFirstThread , sing marisi Utas ) lan miwiti kanthi nelpon metode wiwitan () ing saben obyek. Sawise nelpon cara wiwitan () , logika ing run () cara kaleksanan. Cathetan: jeneng thread ora urut. Iku aneh sing padha ora sequentially:, Utas-1 , Utas-2 , lan liya-liyane? Kaya sing kedadeyan, iki minangka conto wektu nalika pikiran 'sequential' ora cocog. Masalahe yaiku kita mung menehi perintah kanggo nggawe lan mbukak 10 utas. Penjadwal thread, mekanisme sistem operasi khusus, nemtokake urutan eksekusi. Desain sing tepat lan strategi nggawe keputusan minangka topik kanggo diskusi jero sing ora bakal dicekel saiki. Ingkang paling penting kanggo elinga yaiku programmer ora bisa ngontrol urutan eksekusi benang. Kanggo ngerti serius saka kahanan, nyoba mbukak cara utama () ing conto ing ndhuwur saperangan liyane. Output konsol nalika mlaku kapindho: Aku Thread! 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 Console output saka run 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 digawe dening multithreading
Ing conto kita karo buku, sampeyan weruh manawa multithreading ngrampungake tugas sing penting banget lan bisa nggawe program luwih cepet. Asring kaping pirang-pirang luwih cepet. Nanging multithreading dianggep minangka topik sing angel. Pancen, yen digunakake kanthi ora bener, bakal nggawe masalah tinimbang ngrampungake. Nalika aku ngomong 'nggawe masalah', aku ora ateges ing sawetara pangertèn abstrak. Ana rong masalah khusus sing bisa nggawe multithreading: kahanan buntu lan balapan. Deadlock minangka kahanan ing ngendi pirang-pirang benang nunggu sumber daya sing dicekel saben liyane, lan ora ana sing bisa terus mlaku. Kita bakal ngomong luwih akeh babagan iki ing pelajaran sabanjure. Conto ing ngisor iki bakal cukup kanggo saiki: Mbayangno yen Utas-1 sesambungan karo sawetara Obyek-1, lan Utas-2 sesambungan karo Obyek-2. Salajengipun, program kasebut ditulis supaya:- Utas-1 mandheg sesambungan karo Obyek-1 lan ngalih menyang Obyek-2 sanalika Utas-2 mandheg sesambungan karo Obyek-2 lan ngalih menyang Obyek-1.
- Utas-2 mandheg sesambungan karo Obyek-2 lan ngalih menyang Obyek-1 sanalika Utas-1 mandheg sesambungan karo Obyek-1 lan ngalih menyang Obyek-2.
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();
}
}
}
Saiki bayangake manawa program kasebut tanggung jawab kanggo mbukak robot sing masak panganan! Utas-0 njupuk endhog saka kulkas. Utas-1 nguripake kompor. Utas-2 entuk panci lan dilebokake ing kompor. Utas-3 madhangi kompor. Utas-4 pour lenga menyang wajan. Utas-5 ngilangi endhog lan diwutahake menyang wajan. Utas-6 mbuwang cangkang endhog menyang tong sampah. Utas-7 mbusak endhog sing wis masak saka kompor. Utas-8 nyelehake endhog sing wis masak ing piring. Utas-9 ngumbah piring. Deleng asil program kita: Utas dieksekusi: Utas-0 Utas dieksekusi: Utas-2 Utas dieksekusi Utas-1 Utas dieksekusi: Utas-4 Utas dieksekusi: Utas-9 Utas dieksekusi: Utas-5 Utas dieksekusi: Utas-8 Utas kaleksanan: Utas-7 Utas kaleksanan: Utas-3 Apa iki rutinitas komedi? :) Lan kabeh amarga karya program kita gumantung marang urutan eksekusi utas. Diwenehi nglanggar slightest saka urutan sing dibutuhake, pawon kita dadi neraka, lan robot edan numpes kabeh watara. Iki uga masalah umum ing program multithreaded. Sampeyan bakal krungu bab iku luwih saka sapisan. Kanggo ngrampungake pelajaran iki, aku pengin menehi rekomendasi buku babagan multithreading. 'Java Concurrency in Practice' ditulis ing taun 2006, nanging ora ilang relevansi. Iki darmabakti kanggo pemrograman Java multithreaded - saka dhasar nganti kesalahan lan antipattern sing paling umum. Yen sampeyan bakal mutusake dadi guru multithreading, buku iki kudu diwaca. Ditemokake ing wulangan sabanjure! :)
GO TO FULL VERSION