JavaRush /Java Blogu /Random-AZ /Java-da SynchronousQueue nümunəsi - İstehsalçı İstehlakçı...
profeg
Səviyyə

Java-da SynchronousQueue nümunəsi - İstehsalçı İstehlakçı probleminin həlli

Qrupda dərc edilmişdir
Java-da SynchronousQueue nümunəsi - İstehsalçı İstehlakçı probleminin həlli
SynchronousQueue BlockingQueue-nin xüsusi növüdür ki, burada hər bir daxiletmə əməliyyatı başqa mövzuda müvafiq sil əmrini gözləməli və əksinə. SynchronousQueue-da put() metodunu çağırdığınız zaman , başqa bir iplik ondan həmin elementi götürənə qədər bloklanır. Müvafiq olaraq, əgər başqa bir ip ondan elementi çıxarmağa çalışırsa və element orada deyilsə, o zaman digər ip elementi növbəyə qoyana qədər həmin ip bloklanır . SynchronousQueue-ni Olimpiya məşəli ilə qaçan bir idmançı ( sap ) kimi düşünə bilərsiniz , o, məşəllə (ötürülən obyekt) qaçır və onu qarşı tərəfdə gözləyən başqa bir idmançıya ötürür. Ada diqqət yetirsəniz, SynchronousQueue-nin bir səbəbdən belə adlandırıldığını başa düşəcəksiniz, o, məlumatları sinxron şəkildə başqa bir başlığa köçürür ; o, məlumatı daxil etmək və çıxmaq əvəzinə kiminsə məlumatları götürməsini gözləyir (asinxron əməliyyat). Əgər siz CSP və Ada ilə tanışsınızsa, onda siz bilirsiniz ki, sinxronlaşdırılmış növbələr iplərin görüşünə bənzəyir. Onlar nəzarət ötürmə konstruksiyaları üçün çox uyğundur, burada bir mövzuda işləyən obyekt bəzi məlumatı, hadisəni və ya tapşırığı ona ötürmək üçün başqa bir ipdəki obyektlə sinxronizasiya etməlidir. Əvvəlki çox yivli proqramlaşdırma dərslərində biz gözləyin və bildirinBlockingQueue metodlarından istifadə edərək istehsalçı-istehlakçı problemini necə həll edəcəyimizi öyrəndik . İndi biz SynchronousQueue istifadə edərək istehsalçı-istehlakçı modelini necə tətbiq edəcəyimizi öyrənəcəyik . Bu sinif əlavə olaraq istehsalçı və istehlakçı iplərinin gözləmələrini sifariş etmək üçün ədalətli davranışı dəstəkləyir. Varsayılan olaraq, bu sifarişə zəmanət verilmir. Bununla belə, ədalətli xassələrlə yaradılmış növbələr FIFO (Firs In First Out) növbəsindəki mövzulara girişi təmin edir .
Java-da SynchronousQueue istifadə edən istehsalçı/istehlakçı.
Java-da SynchronousQueue nümunəsi - İstehsalçı İstehlakçı probleminin həlli - 1Yuxarıda dediyim kimi, hər hansı bir proqramlaşdırma dilində mövzulararası əlaqəni başa düşmək üçün istehsalçı-istehlakçı problemindən yaxşı heç nə yoxdur . Bu problemdə bir ip hadisə və tapşırıqları yaradan istehsalçı, digər ip isə onun istehlakçısı kimi çıxış edir. Məlumatı istehsalçıdan istehlakçıya ötürmək üçün paylaşılan bufer istifadə olunur. Bu problemi həll etməyin çətinliyi ekstremal hallarda olur, məsələn, istehsalçı gözləmək məcburiyyətində qaldıqda, çünki... bufer doludur və ya istehlakçı gözləmək məcburiyyətində qalır, çünki bufer boşdur. Bu asanlıqla həll edildi, çünki ... Bloklama növbəsi yalnız məlumatların saxlanması üçün bufer deyil, həm də axın nəzarətini təmin etdi, əgər bufer doludursa, put() metodunu (İstehsalçı) çağıran ipi bloklayır və əgər varsa, take() metodunu (İstehlakçı) çağırır. bufer boş idi. İndi biz eyni problemi SynchronousQueue, sıfır tutumlu paralel kolleksiyaların xüsusi növündən istifadə edərək həll edəcəyik . Aşağıdakı misalda PRODUCERCONSUMER adlı iki mövzumuz var (həmişə mövzulara ad verin, bu çoxillik proqramlaşdırmanın çox yaxşı bir üslubudur).Birinci ip oyunda hesabı yerləşdirir, ikinci ip isə onu istehlak edir. Oyundakı hesab String tipli bir obyektdən başqa bir şey deyil. Ancaq proqramı fərqli bir növlə işlətsəniz, heç bir fərq görməyəcəksiniz. SynchronousQueue-nun necə işlədiyini və istehsalçı-istehlakçı problemini necə həll edəcəyinizi başa düşmək üçün sizə lazımdır: ya Eclipse mühitində ayıklama (debug) üçün proqramı işə salın , ya da sadəcə olaraq customer.start(); əgər istehlakçı ipi işləmirsə, onda istehsalçı ip queue.put(hadisə) ünvanında bloklanacaq; işləsəniz, prodüserin [PRODUCERI] :FOUR tədbirini dərc etdiyini görə bilməyəcəksiniz. Bu ona görə baş verir SynchronousQueue-nin xüsusi davranışı, bu, başqa bir başlıq məlumatları alana və əksinə, mövzu göndərmə məlumatının bloklanmasını təmin edir. Kodun qalan hissəsini prodüser.start(); və yalnız istehlakçı mövzusuna başlayır. Proqramın nəticələrini diqqətlə öyrənsəniz, çıxış sırasının əksinə olduğunu görəcəksiniz. Deyəsən [İSTƏKİLÇİ] mövzusu məlumatları [İSTEHSALÇI] mövzusu istehsal etməmişdən əvvəl götürmüşdür. Bunun səbəbi, SynchronousQueue standart olaraq növbəyə zəmanət vermir. Ancaq FIFO qaydasında mövzulara girişi təyin edən ədalət qaydaları var. Siz bu qaydaları həddən artıq yüklənmiş SynchronousQueue konstruktoruna doğru ötürməklə aktiv edə bilərsiniz : 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 haqqında nə yadda saxlamalısınız.

Java-da bu xüsusi növ bloklama növbəsinin bəzi vacib xüsusiyyətləri buradadır. Məlumatların sinxron şəkildə bir ipdən digərinə ötürülməsi çox faydalıdır. Bu növbənin tutumu yoxdur və başqa bir başlıq onu azad edənə qədər bloklanır.

  1. SynchronousQueue blokları və bir başlıq məlumat almağa hazır olana qədər, digəri məlumat qoymağa çalışacaq.
  2. SynchronousQueue-nun həcmi yoxdur. Yəni məlumat ehtiva etmir.
  3. SynchronousQueue irəli növbə strategiyasını həyata keçirmək üçün istifadə olunur, burada iplik nəzarəti gözləyən ipə keçir və ya icazə verildiyi təqdirdə yenisini yaradır, əks halda idarəetmə ötürülmür.
  4. Bu növbə null dataya icazə vermir. Null element əlavə etmək cəhdi NullPointerException atacaq .
  5. Kolleksiyadan başqa üsullardan istifadə etsəniz (məsələn, ehtiva edir), SynchronousQueue özünü boş kolleksiya kimi aparır.
  6. Siz SynchronousQueue-nin peek metodundan istifadə edə bilməzsiniz, çünki element yalnız onu silməyə çalışdığınız zaman mövcuddur; Həmçinin, başqa bir başlıq onu silməyə cəhd etməyənə qədər elementləri (hər hansı üsuldan istifadə etməklə) daxil edə bilməyəcəksiniz.
  7. SynchronousQueue üçün iteratordan istifadə edə bilməyəcəksiniz, çünki... onun heç bir elementi yoxdur.
  8. SynchronousQueue, FIFO qaydasında mövzulara girişin təmin edildiyi ədalətli qaydalarla yaradıla bilər.
Bəlkə də bütün bunlar Java-da SynchronousQueue haqqındadır. Biz bu çox yivli kolleksiyanın bəzi xüsusi xüsusiyyətlərinə baxdıq və Java-da SynchronousQueue istifadə edərək klassik istehsalçı-istehlakçı problemini necə həll edəcəyimizi öyrəndik. Yeri gəlmişkən, onu Növbə adlandırmaq tamamilə düzgün deyil, çünki... elementləri ehtiva etmir. Put() funksiyasına çağırış, take() başqa bir başlıq çağırana qədər tamamlanmayacaq. Onu iplərin birləşdiyi, bir obyekti paylaşdıqları yer kimi düşünmək daha düzgündür. Başqa sözlə, bu, Java-da obyektlərin sinxron şəkildə ötürülməsi üçün bir yardım proqramıdır, bəlkə də gözləmə və bildirmə metoduna daha təhlükəsiz alternativdir .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION