JavaRush /Blog Jawa /Random-JV /Conto SynchronousQueue ing Jawa - ngrampungake masalah Ko...
profeg
tingkat

Conto SynchronousQueue ing Jawa - ngrampungake masalah Konsumen Produser

Diterbitake ing grup
Conto SynchronousQueue ing Jawa - ngrampungake masalah Konsumen Produser
SynchronousQueue minangka jinis BlockingQueue khusus sing saben operasi insert kudu ngenteni perintah mbusak sing cocog ing benang liyane, lan kosok balene. Nalika sampeyan nelpon cara put () ing SynchronousQueue, pamblokiran nganti thread liyane njupuk unsur kasebut. Mulane, yen thread liyane nyoba mbusak unsur saka iku, lan unsur ora ana, banjur thread pamblokiran nganti thread liyane nempatno unsur ing antrian. Sampeyan bisa mikir SynchronousQueue minangka atlit ( thread ) mlaku nganggo obor Olimpiade, dheweke mlaku nganggo obor (obyek sing diterusake) lan diterusake menyang atlet liyane sing nunggu ing sisih liyane. Yen sampeyan nggatekake jeneng kasebut, sampeyan bakal ngerti yen SynchronousQueue dijenengi kanthi alesan, iku nransfer data kanthi sinkron menyang thread liyane ; iku ngenteni wong njupuk data tinimbang mung sijine lan metu (operasi asynchronous). Yen sampeyan kenal karo CSP lan Ada, mula sampeyan ngerti manawa antrian sing disinkronake padha karo rapat benang. Padha cocok kanggo konstruksi transfer kontrol ing ngendi obyek sing mlaku ing siji thread kudu disinkronake karo obyek ing thread liyane supaya bisa ngirim sawetara informasi, acara, utawa tugas. Ing tutorial pemrograman multi-threaded sadurungé, kita sinau carane ngatasi masalah produser-konsumen nggunakake Enteni lan notifikasi lan BlockingQueue cara . Saiki kita bakal sinau carane nggunakake pola produser-konsumen nggunakake SynchronousQueue. Kelas iki uga ndhukung prilaku adil kanggo pesenan ngenteni benang produser lan konsumen. Kanthi gawan, pesenan iki ora dijamin. Nanging, antrian sing digawe kanthi properti sing adil njamin akses kanggo benang ing antrian FIFO (Firs In First Out).
Produser / Konsumen nggunakake SynchronousQueue ing Jawa.
Conto SynchronousQueue ing Jawa - ngrampungake masalah Produser Konsumen - 1 Kaya sing dakkandhakake ing ndhuwur, ora ana sing luwih apik tinimbang masalah produser-konsumen kanggo mangerteni komunikasi antar-utas ing basa pamrograman apa wae. Ing masalah iki, siji thread tumindak minangka produser sing mrodhuksi acara lan tugas, lan thread liyane tumindak minangka konsumen. Buffer sing dienggo bareng digunakake kanggo mindhah data saka produser menyang konsumen. Kangelan kanggo ngrampungake masalah iki teka ing kasus nemen, contone, nalika pabrikan kudu ngenteni amarga ... buffer kebak utawa konsumen dipeksa ngenteni amarga buffer kosong. Iki gampang ditanggulangi, amarga ... Antrian pamblokiran kasedhiya ora mung buffer kanggo nyimpen data, nanging uga kontrol aliran, mblokir thread nelpon cara put () (Produser) yen buffer kebak, lan mblokir thread nelpon njupuk () cara (Konsumen) yen buffer kosong. Saiki kita bakal ngatasi masalah sing padha nggunakake SynchronousQueue, jinis khusus koleksi paralel kanthi kapasitas nol. Ing conto ing ngisor iki, kita duwe rong utas sing diarani PRODUCER lan KONSUMEN (tansah menehi jeneng kanggo benang, iki minangka gaya pemrograman multi-thread sing apik banget). Utas pisanan ngirim skor ing game kasebut, lan benang kapindho nggunakake. Skor ing game ora luwih saka obyek saka jinis String. Nanging yen sampeyan mbukak program karo jinis beda, sampeyan ora bakal sok dong mirsani prabédan. Kanggo ngerti carane SynchronousQueue dianggo, lan carane ngatasi masalah produser-konsumen, sampeyan kudu: salah siji mbukak program kanggo debugging (debug) ing lingkungan Eclipse , utawa mung miwiti thread produser dening komentar metu consumer.start (); yen thread konsumen ora mlaku banjur thread produser bakal diblokir ing queue.put (acara); yen mlaku, sampeyan ora bakal bisa ndeleng produser [PRODUCER] nerbitake acara: FOUR. Iki kedadeyan amarga prilaku tartamtu saka SynchronousQueue, kang mesthekake yen thread posting data bakal mblokir nganti thread liyane njupuk data, lan kosok balene. Sampeyan bisa nyoba liyane kode kanthi menehi komentar producer.start (); lan miwiti mung thread konsumen. Yen sampeyan sinau kanthi teliti apa output program, sampeyan bakal sok dong mirsani sing urutan output wis mbalikke. Kayane thread [KONSUMEN] njupuk data sadurunge thread [PRODUCER] ngasilake. Iki amarga SynchronousQueue ora njamin antrian minangka standar. Nanging nduweni aturan keadilan sing nyetel akses menyang benang ing urutan FIFO. Sampeyan bisa ngaktifake aturan kasebut kanthi ngirim bener menyang konstruktor SynchronousQueue sing overloaded kaya iki: import java.util.concurrent.SynchronousQueue; /** * Java Program to solve Producer Consumer problem using SynchronousQueue. A * call to put() will block until there is a corresponding thread to take() that * element. * * @author Javin Paul */ public class SynchronousQueueDemo{ public static void main(String args[]) { final SynchronousQueue queue = new SynchronousQueue (); Thread producer = new Thread("PRODUCER") { public void run() { String event = "FOUR"; try { queue.put(event); // thread will block here System.out.printf("[%s] published event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; producer.start(); // starting publisher thread Thread consumer = new Thread("CONSUMER") { public void run() { try { String event = queue.take(); // thread will block here System.out.printf("[%s] consumed event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; consumer.start(); // starting consumer thread } } Output: [CONSUMER] consumed event : FOUR [PRODUCER] published event : FOUR new SynchronousQueue(boolean fair).
Apa sampeyan kudu ngelingi babagan SynchronousQueue ing Jawa.

Ing ngisor iki sawetara sifat penting saka antrian pamblokiran khusus iki ing Jawa. Iku migunani banget kanggo ngirim data saka siji thread menyang liyane kanthi cara sing disinkronake. Antrian iki ora nduweni kapasitas lan diblokir nganti thread liyane mbebasake.

  1. SynchronousQueue pamblokiran, lan nganti siji thread siap kanggo njupuk data, liyane bakal nyoba kanggo sijine data.
  2. SynchronousQueue ora duwe volume. Tegese, ora ngemot data.
  3. SynchronousQueue digunakake kanggo ngleksanakake strategi antrian maju, ngendi Utas liwat kontrol kanggo Utas nunggu, utawa nggawe anyar yen diijini, digunakake kontrol ora ditransfer.
  4. Antrian iki ora ngidini data null. Nyoba kanggo nambah unsur null bakal uncalan NullPointerException .
  5. Yen sampeyan nggunakake cara liya saka Koleksi (kayata ngemot), SynchronousQueue tumindak kaya koleksi kosong.
  6. Sampeyan ora bisa nggunakake cara Ndeleng SynchronousQueue amarga unsur mung ana nalika nyoba kanggo mbusak; Uga, sampeyan ora bakal bisa nglebokake unsur (nggunakake cara apa wae) nganti thread liyane nyoba nyopot.
  7. Sampeyan ora bisa nggunakake iterator kanggo SynchronousQueue amarga ... ora ana unsur.
  8. SynchronousQueue bisa digawe karo aturan adil, ngendi akses kanggo Utas dijamin ing urutan FIFO.
Mbok menawa iki kabeh babagan SynchronousQueue ing Jawa. Kita ndeleng sawetara fitur khusus saka koleksi multi-threaded iki, lan sinau carane ngatasi masalah produser-konsumen klasik nggunakake SynchronousQueue ing Jawa. Miturut cara, nyebataken antrian iku ora sakabehe bener, amarga ... iku ora ngemot unsur. Telpon sijine () ora bakal rampung nganti thread liyane telpon njupuk (). Iku luwih bener kanggo mikir iku minangka panggonan patemon Utas, ngendi padha nuduhake obyek. Ing tembung liyane, iku sarana kanggo nyinkronake maringaken obyek ing Jawa, mbok menawa alternatif luwih aman kanggo ngenteni lan ngabari cara .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION