JavaRush /Java Blog /Random-TK /Java-da SynchronousQueue mysaly - Önüm öndürijisi meseles...
profeg
Dereje

Java-da SynchronousQueue mysaly - Önüm öndürijisi meselesini çözmek

Toparda çap edildi
Java-da SynchronousQueue mysaly - Önüm öndürijisi meselesini çözmek
SynchronousQueue, her bir goýmak amaly başga bir sapakda degişli aýyrmak buýrugyna garaşmaly we tersine, Blokirlemegiň ýörite görnüşidir. SynchronousQueue-da put () usulyna jaň edeniňizde , başga bir sapak şol elementi alýança bloklanýar. Şoňa görä, başga bir sapak ondan bir elementi aýyrjak bolsa we element ýok bolsa, beýleki sapak elementi nobata goýýança şol sapak bloklanýar . “SynchronousQueue” -ni Olimpiýa fakeli bilen ylgaýan atlet ( sapak ) diýip pikir edip bilersiňiz , fakel bilen (geçýän obýekt) ylgaýar we beýleki tarapa garaşýan başga bir türgene geçirýär. Adyna üns berseňiz, SynchronousQueue-yň bir sebäbe görä atlandyrylandygyna düşünersiňiz; maglumatlary sinhron başga bir sapaga geçirýär ; kimdir biriniň maglumatlary goýup, çykmagyň ýerine (asynkron operasiýa) garaşýar. CSP we Ada bilen tanyş bolsaňyz, sinhronlaşdyrylan nobatlaryň sapaklaryň ýygnagyna meňzeýändigini bilýärsiňiz. Dolandyryş geçiriş gurluşlary üçin olar örän laýykdyr, onda bir sapakda işleýän obýekt, käbir maglumatlary, hadysany ýa-da meseläni geçirmek üçin başga bir sapakdaky obýekt bilen sinhronlaşmalydyr. Öňki köp sapakly programmirleme sapaklarynda, garaşmak we habar bermek we BlockingQueue usullaryny ulanyp, öndüriji-sarp ediji meselesini nädip çözmelidigini öwrendik . Indi SynchronousQueue ulanyp, öndüriji-sarp ediji nagşyny nähili ulanmalydygyny öwreneris . Bu synp, öndürijiniň we sarp edijiniň sapaklaryna garaşmak üçin adalatly özüni alyp barşyny goldaýar. Düzgüne görä, bu sargyt kepillendirilmeýär. Şeýle-de bolsa, adalatly häsiýetler bilen döredilen nobatlar, FIFO (Firs In First Out) nobatynda sapaklara girmegi kepillendirýär .
Java-da SynchronousQueue ulanyp öndüriji / sarp ediji.
Java-da SynchronousQueue mysaly - meseläni çözmek Öndüriji sarp ediji - 1Aboveokarda aýdyşym ýaly, islendik programmirleme dilinde sapaklar arasyndaky aragatnaşyga düşünmek üçin öndüriji-sarp ediji meselesinden gowy zat ýok . Bu meselede, bir sapak hadysalary we meseleleri öndürýän öndüriji, beýlekisi bolsa sarp ediji hökmünde çykyş edýär. Maglumat öndürijiden sarp edijä geçirmek üçin umumy bufer ulanylýar. Bu meseläni çözmegiň kynlygy aşa ýagdaýlarda ýüze çykýar, mysal üçin öndüriji garaşmaga mejbur bolanda ... bufer doly ýa-da sarp ediji garaşmaga mejbur bolýar bufer boş. Bu aňsatlyk bilen çözüldi, sebäbi ... Blokirleme nobaty diňe maglumatlary saklamak üçin bufer bilen çäklenmän, akymyň gözegçiligini hem üpjün etdi, bufer doly bolsa goýlan () usuly (Önümçi) diýilýän sapagy blokirledi we almak () usuly (Sarp ediji) diýilýän sapagy blokirledi. bufer boşdy. Indi bu meseläni nol kuwwatly paralel kolleksiýalaryň aýratyn görnüşi bolan SynchronousQueue ulanyp çözeris . Aşakdaky mysalda PRODUCER we CONSUMER atly iki sapak bar (elmydama sapaklara at beriň, bu köp sapakly programmirlemegiň gaty gowy stili). Birinji sapak oýunda bal ýazýar, ikinji sapak bolsa ony sarp edýär. Oýundaky bal, “String” görnüşinden başga zat däl. Theöne programmany başga görnüş bilen işletseňiz, hiç hili tapawudy görmersiňiz. SynchronousQueue-yň işleýşine we öndüriji-sarp ediji meselesini nädip çözmelidigine düşünmek üçin aşakdakylary etmeli: ýa-da Eclipse gurşawynda düzediş (düzediş) programmasyny işletmeli ýa-da sarp ediji.start () düşündiriş bermek bilen öndürijiniň sapagyny başlamaly; sarp ediji sapagy işlemeýän bolsa, öndüriji sapak nobat.put (waka) -da petiklener; işleýän bolsa, prodýuseriň [ÖNÜMÇI]: Dördünji wakany çap edip bilmersiňiz. Sebäbi şeýle bolýar SynchronousQueue-yň aýratyn özüni alyp barşy, bu sapak iberilýän maglumatlaryň başga bir sapak alýança petiklenmegini üpjün edýär we tersine. Kodyň galan bölegini öndüriji.start () teswirläp synap bilersiňiz; we diňe sarp ediji sapagyny başlamak. Programmanyň netijelerini üns bilen öwrenseňiz, çykyş tertibiniň tersine bolandygyny görersiňiz. [ÖNÜMLER ] sapagy öndürilmezden ozal [CONSUMER] sapagy maglumatlary alana meňzeýär . Sebäbi SynchronousQueue deslapky nobata durmagy kepillendirmeýär. Emma FIFO tertibi boýunça sapaklara girmegi kesgitleýän adalatlylyk düzgünleri bar. Bu düzgünleri aşa ýüklenen SynchronousQueue konstruktoryna dogry geçip, şeýle edip bilersiňiz : 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).
Java-da SynchronousQueue hakda ýatda saklamaly zatlaryňyz.

Java-da bu ýörite blokirleme nobatynyň käbir möhüm aýratynlyklary. Sinhron görnüşde maglumatlary bir sapakdan beýlekisine geçirmek gaty peýdaly. Bu nobatyň hiç hili güýji ýok we başga bir sapak boşadýança petiklenýär.

  1. SynchronousQueue bloklary we bir sapak maglumat almaga taýyn bolýança, beýlekisi maglumat goýmaga synanyşar.
  2. “SynchronousQueue” -iň çägi ýok. .Agny, maglumat ýok.
  3. “SynchronousQueue” öňe nobat strategiýasyny durmuşa geçirmek üçin ulanylýar, bu ýerde bir sapak garaşylýan sapaga geçýär ýa-da rugsat berilse täzesini döredýär, ýogsam gözegçilik geçirilmeýär.
  4. Bu nobat boş maglumatlara rugsat bermeýär. Bir null element goşmak synanyşygy NullPointerException atar .
  5. Collectionygyndydan başga usullary ulanýan bolsaňyz (meselem öz içine alýar), SynchronousQueue boş ýygyndy ýaly özüni alyp barýar.
  6. SynchronousQueue-iň iň ýokary usulyny ulanyp bilmersiňiz, sebäbi element diňe aýyrjak bolanyňyzda bar; Mundan başga-da, başga bir sapak aýyrjak bolýança elementleri (islendik usuly ulanyp) goýup bilmersiňiz.
  7. SynchronousQueue üçin iterator ulanyp bilmersiňiz, sebäbi ... elementleri ýok.
  8. SynchronousQueue, FIFO tertibinde sapaklara girmek kepillendirilen adalatly düzgünler bilen döredilip bilner.
Belki, bularyň hemmesi Java-da SynchronousQueue hakda. Bu köp sapakly kolleksiýanyň käbir aýratynlyklaryna göz aýladyk we Java-da SynchronousQueue ulanyp, nusgawy öndüriji-sarp ediji meselesini nädip çözmelidigini öwrendik. Theeri gelende aýtsak, nobat diýmek düýbünden dogry däl, sebäbi ... elementleri öz içine almaýar. () Goýmak jaňy başga bir sapak alýança gutarmaz (). Bir obýekti paýlaşýan sapaklaryň ýygnanýan ýeri diýip pikir etmek has dogrydyr. Başga sözler bilen aýdylanda, Java-da obýektleriň sinhron geçmegi üçin peýdalydyr, belki garaşmak we habar bermek usulyna has ygtybarly alternatiwa .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION