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ə bildirin və BlockingQueue 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 - 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 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.
- 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.
- SynchronousQueue-nun həcmi yoxdur. Yəni məlumat ehtiva etmir.
- 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.
- Bu növbə null dataya icazə vermir. Null element əlavə etmək cəhdi NullPointerException atacaq .
- Kolleksiyadan başqa üsullardan istifadə etsəniz (məsələn, ehtiva edir), SynchronousQueue özünü boş kolleksiya kimi aparır.
- 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.
- SynchronousQueue üçün iteratordan istifadə edə bilməyəcəksiniz, çünki... onun heç bir elementi yoxdur.
- SynchronousQueue, FIFO qaydasında mövzulara girişin təmin edildiyi ədalətli qaydalarla yaradıla bilər.
GO TO FULL VERSION