JavaRush /Blog Jawa /Random-JV /Multithreading ing Jawa: inti, kaluwihan lan pitfalls umu...

Multithreading ing Jawa: inti, kaluwihan lan pitfalls umum

Diterbitake ing grup
Hello! Kaping pisanan, sugeng rawuh: sampeyan wis tekan topik Multithreading ing basa Jawa! Iki minangka prestasi sing serius, ana dalan sing dawa. Nanging siyap: iki minangka salah sawijining topik sing paling angel ing kursus kasebut. Lan titik kasebut dudu kelas sing kompleks utawa akeh metode sing digunakake ing kene: sebaliknya, ora ana rong rolas. Luwih-luwih sampeyan kudu ngowahi pikirane sethithik. Sadurunge, program sampeyan dieksekusi kanthi urutan. Sawetara baris kode ngetutake wong liya, sawetara cara ngetutake liyane, lan sakabehe kabeh wis jelas. Pisanan, ngetung soko, banjur nampilake asil ing console, banjur siksa program. Kanggo mangerteni multithreading, luwih becik mikir babagan konkurensi. Ayo diwiwiti kanthi prasaja banget :) Multithreading ing Jawa: inti, kaluwihan lan pitfalls umum - 1Bayangake yen kulawarga sampeyan pindhah saka omah siji menyang omah liyane. Bagéyan penting saka obah yaiku ngemas buku. Sampeyan wis nglumpukake akeh buku, lan sampeyan kudu nyelehake ing kothak. Saiki mung sampeyan sing bebas. Ibu lagi nyiyapake panganan, adhine ngumpulake sandhangan, lan adhine wis menyang toko. Piyambak sampeyan bisa ngatur, paling ora, lan, cepet utawa mengko, sampeyan malah bakal ngrampungake tugas dhewe, nanging bakal njupuk akèh wektu. Nanging, ing 20 menit adhine bakal bali saka toko, lan dheweke ora duwe apa-apa. Dadi dheweke bisa melu sampeyan. Tugas tetep padha: sijine buku ing kothak. Iku mung mbukak kaping pindho minangka cepet. Kenging punapa? Amarga karya rampung ing podo karo. Loro "benang" sing beda (sampeyan lan adhine) nindakake tugas sing padha lan, yen ora ana owah-owahan, prabédan wektu bakal gedhe banget dibandhingake karo kahanan sing sampeyan bakal nindakake kabeh. Yen sedulurmu cepet ngrampungake tugase, dheweke bisa nulungi sampeyan, lan kabeh bakal luwih cepet.

Masalah sing dirampungake karo multithreading ing Jawa

Intine, multithreading Jawa diciptakake kanggo ngrampungake rong masalah utama:
  1. 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!

    Multithreading ing Jawa: inti, kaluwihan lan pitfalls umum - 3

    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 :)

  2. 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.

Nanging, kaya sing wis diwaca ing kuliah, sistem modern banget pinter, lan malah ing siji inti komputasi bisa ngleksanakake paralelisme, utawa pseudo-parallelism, nalika tugas dileksanakake gantian. Ayo dadi pindhah saka umum menyang tartamtu lan njaluk kenalan karo kelas utama ing perpustakaan Jawa related kanggo multithreading - java.lang.Thread. Tegese, utas ing basa Jawa diwakili dening conto kelas 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. Threadlan ngganti cara ing run(). Sing terakhir penting banget. Ing cara run()kita nemtokake logika sing kudu ditindakake thread kita. Saiki, yen kita nggawe conto MyFirstThreadlan 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) MyFirstThreadsing diwarisake Threadlan 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-2lan 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: Multithreading ing Jawa: inti, kaluwihan lan pitfalls umum - 4 Mbayangno sing thread-1 nggarap sawetara Obyek-1, lan thread-2 nggarap Object-2. Program kasebut ditulis kaya mangkene:
  1. Utas-1 bakal mandheg nggarap Obyek-1 lan ngalih menyang Obyek-2 sanalika Utas-2 mandheg nggarap Obyek 2 lan ngalih menyang Obyek-1.
  2. Utas-2 bakal mandheg nggarap Obyek-2 lan ngalih menyang Obyek-1 sanalika Utas-1 mandheg nggarap Obyek 1 lan ngalih menyang Obyek-2.
Malah tanpa kawruh jero babagan multithreading, sampeyan bisa kanthi gampang ngerti manawa ora ana sing bakal ditindakake. Utas ora bakal ngganti panggonan lan bakal ngenteni saben liyane ing salawas-lawase. Kesalahan katon jelas, nanging nyatane ora. Sampeyan bisa gampang ngidini menyang program. Kita bakal ndeleng conto kode sing nyebabake deadlock ing kuliah ing ngisor iki. Miturut cara, Quora duwe conto urip nyata sing nerangake apa sing dadi deadlock . "Ing sawetara negara ing India, dheweke ora bakal ngedol tanah tetanèn kajaba sampeyan kadhaptar minangka petani. Nanging, sampeyan ora bakal kadhaptar dadi petani yen sampeyan ora duwe lahan pertanian. Apik, apa sing bisa dakkandhakake! :) Saiki bab kondisi lomba - kahanan lomba. Multithreading ing Jawa: inti, pro lan pitfalls umum - 5Kondisi balapan minangka cacat desain ing sistem utawa aplikasi multi-threaded ing ngendi operasi sistem utawa aplikasi gumantung saka urutan bagean kode sing dieksekusi. Elingi conto nganggo benang sing mlaku:
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.
Multithreading ing Jawa: inti, pro lan pitfalls umum - 6
"Java Concurrency in Practice" ditulis ing taun 2006, nanging ora ilang relevansi. Iki kalebu program multithreaded ing Jawa, diwiwiti saka dhasar lan dipungkasi kanthi dhaptar kesalahan lan antipattern sing paling umum. Yen sampeyan mutusake dadi guru pemrograman multithreaded, buku iki kudu diwaca. Sampai jumpa lagi ing kuliah sabanjure! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION