Намунаи SynchronousQueue дар Java - ҳалли мушкилоти Истеҳсолкунандаи Истеъмолкунанда
SynchronousQueue як навъи махсуси BlockingQueue мебошад, ки дар он ҳар як амалиёти воридкунӣ бояд фармони хориҷкунии мувофиқро дар риштаи дигар интизор шавад ва баръакс. Вақте ки шумо усули put()-ро дар SynchronousQueue даъват мекунед, он то он даме, ки риштаи дигар ин элементро аз он мегирад, блок мекунад. Мутаносибан, агар риштаи дигар кӯшиш кунад, ки элементро аз он хориҷ кунад ва элемент дар он ҷо набошад, он ришта то он даме, ки риштаи дигар элементро дар навбат мегузорад, блок мекунад. Шумо метавонед дар бораи SynchronousQueue ҳамчун варзишгар ( ришта ) бо машъали олимпӣ давида фикр кунед, ӯ бо машъал (an objectе, ки ба он интиқол дода мешавад) давида, онро ба варзишгари дигаре, ки дар тарафи дигар интизор аст, медиҳад. Агар шумо ба ном диққат диҳед, шумо мефаҳмед, ки SynchronousQueue бо ягон сабаб чунин номгузорӣ шудааст; он маълумотро ба таври синхронӣ ба риштаи дигар интиқол медиҳад ; он интизор аст, ки касе маълумотро ба ҷои гузоштан ва баромадан (амали асинхронӣ) гирад. Агар шумо бо CSP ва Ada шинос бошед, пас шумо медонед, ки навбатҳои ҳамоҳангшуда ба вохӯрии риштаҳо монанданд. Онҳо барои конструксияҳои интиқоли назорат хеле мувофиқанд, ки дар он an objectе, ки дар як ришта кор мекунад, бояд бо an objectи риштаи дигар синхронизатсия карда шавад, то ки баъзе маълумот, ҳодиса ё вазифаро ба он интиқол диҳад. Дар дарсҳои қаблии барномасозӣ, мо фаҳмидем, ки чӣ гуна ҳалли мушкилоти истеҳсолкунанда-истеъмолкунанда бо истифода аз усулҳои интизор ва огоҳӣ ва BlockingQueue . Акнун мо меомӯзем, ки чӣ тавр истифода бурдани намунаи истеҳсолкунанда-истеъмолкунанда бо истифода аз SynchronousQueue. Ин синф ба таври илова рафтори одилонаро барои фармоиш додани интизориҳои истеҳсолкунанда ва истеъмолкунанда дастгирӣ мекунад. Бо нобаёнӣ, ин фармоиш кафолат дода намешавад. Аммо, навбатҳое, ки бо хосиятҳои одилона сохта шудаанд, дастрасиро ба риштаҳо дар навбати FIFO (Firs In First Out) кафолат медиҳанд.Истеҳсолкунанда/истеъмолкунанда бо истифода аз SynchronousQueue дар Java.
![Намунаи SynchronousQueue дар Java - ҳалли мушкилот Истеҳсолкунанда Истеъмолкунанда - 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).
Он чизе ки шумо бояд дар бораи SynchronousQueue дар Java дар хотир доред.
Инҳоянд баъзе хосиятҳои муҳими ин навъи махсуси навбати басташавӣ дар Java. Ба таври синхронӣ интиқол додани маълумот аз як ришта ба риштаи дигар хеле муфид аст. Ин навбат иқтидор надорад ва то он даме, ки риштаи дигар онро озод накунад, баста мешавад.
- SynchronousQueue блок мекунад ва то он даме, ки як ришта барои гирифтани маълумот омода аст, дигаре кӯшиш мекунад, ки маълумотро ҷойгир кунад.
- SynchronousQueue доираи фаъолият надорад. Яъне он маълумотро дар бар намегирад.
- SynchronousQueue барои татбиқи стратегияи навбати пеш истифода мешавад, ки дар он ришта назоратро ба риштаи интизорӣ мегузарад ё агар иҷозат дода шавад, наверо эҷод мекунад, вагарна назорат интиқол дода намешавад.
- Ин навбат маълумоти бефоидаро иҷозат намедиҳад. Кӯшиши илова кардани унсури нул NullPointerException -ро мепартояд .
- Агар шумо усулҳои дигареро аз Коллексия истифода баред (ба монанди дорои), SynchronousQueue мисли коллексияи холӣ рафтор мекунад.
- Шумо усули peek-и SynchronousQueue-ро истифода бурда наметавонед, зеро элемент танҳо вақте вуҷуд дорад, ки шумо онро хориҷ кардан мехоҳед; Инчунин, шумо наметавонед элементҳоро (бо истифода аз ягон усул) ворид кунед, то даме ки риштаи дигар онро нест кардан накунад.
- Шумо наметавонед итераторро барои SynchronousQueue истифода баред, зеро... он унсуре надорад.
- SynchronousQueue-ро бо қоидаҳои одил сохтан мумкин аст, ки дастрасӣ ба риштаҳо бо тартиби FIFO кафолат дода мешавад.
GO TO FULL VERSION