CodeGym /Blog Jawa /Acak /Multithreading ing Jawa
John Squirrels
tingkat
San Francisco

Multithreading ing Jawa

Diterbitake ing grup
Hi! Kaping pisanan, sugeng rawuh: sampeyan wis tekan topik Multithreading ing basa Jawa! Iki minangka prestasi sing serius — sampeyan wis tekan adoh. Nanging nyiyapake dhewe: iki minangka salah sawijining topik sing paling angel ing kursus kasebut. Lan dudu yen kita nggunakake kelas kompleks utawa akeh metode ing kene: nyatane, kita bakal nggunakake kurang saka rong puluh. Luwih maneh sampeyan kudu ngganti cara sampeyan mikir. Sadurunge, program sampeyan wis dieksekusi sacara berurutan. Sawetara baris kode teka sawise liyane, sawetara cara teka sawise liyane, lan kabeh iku Sejatine cetha. Pisanan, kita ngetung soko, banjur ditampilake asil ing console, lan banjur program rampung. Kanggo mangerteni multithreading, luwih becik mikir babagan paralelisme. Ayo miwiti kanthi prasaja: ) Bayangna kulawargamu pindhah saka omah siji menyang omah liyane. Ngumpulake kabeh buku sampeyan bakal dadi bagian penting saka pamindhahan. Sampeyan wis nglumpukake akeh buku, lan sampeyan kudu nyelehake ing kothak. Saiki, sampeyan mung siji sing kasedhiya. Ibu nyiyapake panganan, adhine lagi ngemas sandhangan, lan adhine menyang toko. Piyambak, sampeyan bisa ngatur piye wae. Cepet utawa mengko, sampeyan bakal ngrampungake tugas dhewe, nanging butuh wektu akeh. Nanging, adhine bakal bali saka toko ing 20 menit, lan dheweke ora duwe apa-apa liyane. Dadi dheweke bisa melu sampeyan. Tugas ora diganti: sijine buku ing kothak. Nanging lagi ditindakake kaping pindho kanthi cepet. Kenging punapa? Amarga karya wis kedados ing podo karo. Loro 'benang' sing beda (sampeyan lan adhine) nindakake tugas sing padha bebarengan. Lan yen ora ana owah-owahan, banjur bakal ana prabédan wektu ageng dibandhingake karo kahanan ing ngendi sampeyan nindakake kabeh dhewe. Yen sedulure cepet rampung, dheweke bisa nulungi sampeyan lan kabeh bakal luwih cepet.

Masalah ditanggulangi kanthi multithreading

Multithreading bener-bener diciptakake kanggo nggayuh rong tujuan penting:
  1. 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!

    Multithreading ing Jawa: apa iku, keuntungan lan pitfalls umum - 3

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

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

Nanging sing wis diwaca ing wulangan iki, sistem saiki banget pinter, lan malah siji inti komputasi bisa kanggo entuk podo, utawa pseudo-parallelism, ngendi tugas dileksanakake gantian. Ayo pindhah umum menyang spesifik lan ngerti kelas paling penting ing perpustakaan multithreading Jawa - java.lang.Thread. Tegese, Utas Jawa diwakili dening conto kelas Utas . Iki tegese kanggo nggawe lan mbukak 10 utas, sampeyan butuh 10 conto 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 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: Multithreading ing Jawa: apa iku, keuntungan lan pitfalls umum - 4Mbayangno yen Utas-1 sesambungan karo sawetara Obyek-1, lan Utas-2 sesambungan karo Obyek-2. Salajengipun, program kasebut ditulis supaya:
  1. 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.
  2. 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.
Sanajan tanpa pangerten jero babagan multithreading, sampeyan bisa kanthi gampang ndeleng manawa ora ana sing bakal kedadeyan. Utas ora bakal ganti panggonan lan bakal ngenteni saben liyane ing salawas-lawase. Kesalahan katon jelas, nanging nyatane ora. Sampeyan bisa kanthi gampang nindakake iki ing program. Kita bakal nimbang conto kode sing nyebabake deadlock ing pelajaran sabanjure. Miturut cara, Quora duwe conto urip nyata sing nerangake apa deadlockpunika. 'Ing sawetara negara ing India, dheweke ora bakal ngedol sampeyan tanah tetanèn kajaba sampeyan minangka petani sing kadhaptar. Nanging, dheweke ora bakal ndhaptar sampeyan dadi petani yen sampeyan ora duwe lahan pertanian'. apik tenan! Apa sing bisa kita ucapake?! :) Saiki ayo ngomong babagan kondisi balapan. Kondisi balapan minangka kesalahan desain ing sistem utawa aplikasi multithreaded, ing ngendi operasi sistem utawa aplikasi gumantung saka urutan bagean kode sing dieksekusi. Elinga, conto kita ing ngendi kita miwiti utas:

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. Multithreading ing Jawa: apa iku, keuntungan lan pitfalls umum - 6'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! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION