JavaRush /Блоги Java /Random-TG /Намунаи SynchronousQueue дар Java - ҳалли мушкилоти Истеҳ...
profeg
Сатҳи

Намунаи SynchronousQueue дар Java - ҳалли мушкилоти Истеҳсолкунандаи Истеъмолкунанда

Дар гурӯҳ нашр шудааст
Намунаи 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Тавре ки ман дар боло гуфтам, беҳтар аз мушкилоти истеҳсолкунанда ва истеъмолкунанда барои фаҳмидани муоширати байни риштаҳо дар ҳама гуна забони барномасозӣ вуҷуд надорад . Дар ин масъала як ришта ҳамчун истеҳсолкунанда баромад мекунад, ки рӯйдодҳо ва вазифаҳоро тавлид мекунад ва риштаи дигар ҳамчун истеъмолкунандаи он баромад мекунад. Буфери муштарак барои интиқоли маълумот аз истеҳсолкунанда ба истеъмолкунанда истифода мешавад. Мушкorи ҳалли ин мушкилот дар ҳолатҳои шадид ба миён меояд, масалан, вақте ки истеҳсолкунанда маҷбур аст интизор шавад, зеро ... буфер пур аст ё истеъмолкунанда маҷбур аст интизор шавад, зеро буфер холӣ аст. Ин ба осонӣ ҳал карда шуд, зеро ... Навбати басташавӣ на танҳо буферро барои нигоҳдории додаҳо, балки назорати ҷараёнро низ таъмин кард, агар буфер пур бошад, риштаеро, ки усули put() даъват мекунад (Истеҳсолкунанда) ва бастани риштае, ки усули take()-ро (Consumer) даъват мекунад, агар буфер холӣ буд. Ҳоло мо ин масъаларо бо истифода аз SynchronousQueue, як навъи махсуси коллексияҳои мувозӣ бо иқтидори сифр ҳал хоҳем кард. Дар мисоли зерин, мо ду ришта дорем, ки PRODUCER ва CONSUMER номида мешаванд (ҳамеша ба риштаҳо ном диҳед, ин услуби хеле хуби барномасозии чанд ришта аст). Риштаи аввал ҳисобро дар бозӣ мегузорад ва риштаи дуюм онро истеъмол мекунад. Ҳисоб дар бозӣ ҷуз як an objectи навъи String чизе нест. Аммо агар шумо барномаро бо навъи дигар иҷро кунед, шумо ягон фарқиятро мушоҳида намекунед. Барои фаҳмидани он ки чӣ тавр SynchronousQueue кор мекунад ва чӣ гуна ҳалли мушкилоти истеҳсолкунанда-истеъмолкунанда, шумо бояд: ё барномаро барои ислоҳи хатогиҳо (debug) дар муҳити Eclipse иҷро кунед , ё танҳо бо шарҳ додани истеъмоли.start() риштаи истеҳсолкунандаро оғоз кунед; агар риштаи истеъмолкунанда кор накунад, риштаи истеҳсолкунанда дар queue.put(event) баста мешавад; агар иҷро шавад, шумо наметавонед бубинед, ки продюсер [ПРОДЮСЕР] чорабинии :FOUR-ро нашр мекунад. Ин аз он сабаб рӯй медиҳад рафтори мушаххаси SynchronousQueue, ки кафолат медиҳад, ки маълумоти интишори ришта то он даме, ки риштаи дигар маълумотро гирад ва баръакс. Шумо метавонед боқимондаи codeро тавассути шарҳ додан дар продюсер.start(); ва танҳо риштаи истеъмолиро оғоз мекунад. Агар шумо бодиққат омӯзед, ки барнома чӣ натиҷа медиҳад, шумо мебинед, ки тартиби баромад баръакс аст. Чунин ба назар мерасад, ки риштаи [истеъмолкунанда] маълумотро пеш аз тавлиди риштаи [ПРОДЮСЕР] гирифта буд. Сабаб дар он аст, ки SynchronousQueue бо нобаёнӣ навбат монданро кафолат намедиҳад. Аммо он дорои қоидаҳои адолат аст, ки дастрасӣ ба риштаҳоро бо тартиби FIFO муқаррар мекунад. Шумо метавонед ин қоидаҳоро тавассути гузариш ба созандаи изофабори SynchronousQueue ба таври зерин фаъол созед: 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. Ба таври синхронӣ интиқол додани маълумот аз як ришта ба риштаи дигар хеле муфид аст. Ин навбат иқтидор надорад ва то он даме, ки риштаи дигар онро озод накунад, баста мешавад.

  1. SynchronousQueue блок мекунад ва то он даме, ки як ришта барои гирифтани маълумот омода аст, дигаре кӯшиш мекунад, ки маълумотро ҷойгир кунад.
  2. SynchronousQueue доираи фаъолият надорад. Яъне он маълумотро дар бар намегирад.
  3. SynchronousQueue барои татбиқи стратегияи навбати пеш истифода мешавад, ки дар он ришта назоратро ба риштаи интизорӣ мегузарад ё агар иҷозат дода шавад, наверо эҷод мекунад, вагарна назорат интиқол дода намешавад.
  4. Ин навбат маълумоти бефоидаро иҷозат намедиҳад. Кӯшиши илова кардани унсури нул NullPointerException -ро мепартояд .
  5. Агар шумо усулҳои дигареро аз Коллексия истифода баред (ба монанди дорои), SynchronousQueue мисли коллексияи холӣ рафтор мекунад.
  6. Шумо усули peek-и SynchronousQueue-ро истифода бурда наметавонед, зеро элемент танҳо вақте вуҷуд дорад, ки шумо онро хориҷ кардан мехоҳед; Инчунин, шумо наметавонед элементҳоро (бо истифода аз ягон усул) ворид кунед, то даме ки риштаи дигар онро нест кардан накунад.
  7. Шумо наметавонед итераторро барои SynchronousQueue истифода баред, зеро... он унсуре надорад.
  8. SynchronousQueue-ро бо қоидаҳои одил сохтан мумкин аст, ки дастрасӣ ба риштаҳо бо тартиби FIFO кафолат дода мешавад.
Шояд ин ҳама дар бораи SynchronousQueue дар Java бошад. Мо ба баъзе хусусиятҳои махсуси ин коллексияи бисёрсоҳавӣ назар кардем ва фаҳмидем, ки чӣ гуна ҳалли мушкилоти классикии истеҳсолкунанда-истеъмолкунанда бо истифода аз SynchronousQueue дар Java. Воқеан, онро Навбат номидан комилан дуруст нест, зеро... он унсурҳоро дар бар намегирад. Занг ба put() то замоне анҷом намешавад, ки риштаи дигар take() занг занад. Онро ҳамчун ҷои вохӯрии риштаҳо тасаввур кардан дурусттар аст, ки дар он an objectи муштарак доранд. Ба ибораи дигар, он як утorта барои интиқоли ҳамоҳангшудаи an objectҳо дар Java аст, шояд алтернативаи бехатартар ба усули интизорӣ ва огоҳӣ бошад .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION