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 - 1](https://cdn.javarush.com/images/article/cadfb899-3d92-40d8-9d6b-19836b3d44a3/1024.jpeg)
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.
- SynchronousQueue bloklary we bir sapak maglumat almaga taýyn bolýança, beýlekisi maglumat goýmaga synanyşar.
- “SynchronousQueue” -iň çägi ýok. .Agny, maglumat ýok.
- “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.
- Bu nobat boş maglumatlara rugsat bermeýär. Bir null element goşmak synanyşygy NullPointerException atar .
- Collectionygyndydan başga usullary ulanýan bolsaňyz (meselem öz içine alýar), SynchronousQueue boş ýygyndy ýaly özüni alyp barýar.
- 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.
- SynchronousQueue üçin iterator ulanyp bilmersiňiz, sebäbi ... elementleri ýok.
- SynchronousQueue, FIFO tertibinde sapaklara girmek kepillendirilen adalatly düzgünler bilen döredilip bilner.
GO TO FULL VERSION