Java-dagi SynchronousQueue misoli - ishlab chiqaruvchi iste'molchi muammosini hal qilish
SynchronousQueue - bu BlockingQueue ning maxsus turi bo'lib, unda har bir qo'shish amali boshqa oqimda mos keladigan olib tashlash buyrug'ini kutishi kerak va aksincha. SynchronousQueue-da put() usulini chaqirganingizda , u elementni boshqa ipdan olmaguncha bloklaydi. Shunga ko'ra, agar boshqa ip undan elementni olib tashlashga harakat qilsa va element u erda bo'lmasa, u boshqa ip elementni navbatga qo'ymaguncha bloklanadi . Siz SynchronousQueue-ni Olimpiya mash'alasi bilan yugurayotgan sportchi ( ip ) deb o'ylashingiz mumkin, u mash'al (uzatilayotgan ob'ekt) bilan yuguradi va uni boshqa tomonda kutib turgan boshqa sportchiga uzatadi. Agar siz nomga e'tibor qaratsangiz, SynchronousQueue biron sababga ko'ra shunday nomlanganini tushunasiz, u ma'lumotlarni sinxron ravishda boshqa oqimga uzatadi ; u shunchaki kiritish va chiqish o'rniga kimdir ma'lumotlarni olishini kutadi (asinxron operatsiya). Agar siz CSP va Ada bilan tanish bo'lsangiz, sinxronlashtirilgan navbatlar iplar yig'ilishiga o'xshashligini bilasiz. Ular boshqaruv uzatish konstruksiyalari uchun juda mos keladi, bunda bitta ipda ishlaydigan ob'ekt ba'zi bir ma'lumot, hodisa yoki topshiriqni uzatish uchun boshqa oqimdagi ob'ekt bilan sinxronlashishi kerak. Oldingi ko'p bosqichli dasturlash darslarida biz kutish va xabar berish va BlockingQueue usullaridan foydalangan holda ishlab chiqaruvchi-iste'molchi muammosini qanday hal qilishni o'rgandik . Endi biz SynchronousQueue yordamida ishlab chiqaruvchi-iste'molchi naqshini qanday qo'llashni o'rganamiz . Ushbu sinf qo'shimcha ravishda ishlab chiqaruvchi va iste'molchi iplarining kutishlariga buyurtma berish uchun adolatli xatti-harakatlarni qo'llab-quvvatlaydi. Odatiy bo'lib, bu buyurtma kafolatlanmaydi. Biroq, adolatli xususiyatlar bilan yaratilgan navbatlar FIFO (birinchi kiruvchi birinchi chiqish) navbatidagi mavzularga kirishni kafolatlaydi .Java-da SynchronousQueue-dan foydalanadigan ishlab chiqaruvchi/iste'molchi.
![Java-dagi SynchronousQueue misoli - muammoni hal qilish Ishlab chiqaruvchi iste'molchi - 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 haqida nimalarni eslash kerak.
Java-da blokirovka navbatining ushbu maxsus turining ba'zi muhim xususiyatlari. Sinxronlashtirilgan tarzda ma'lumotlarni bir ipdan ikkinchisiga uzatish juda foydali. Bu navbatning sig'imi yo'q va boshqa ip uni bo'shatmaguncha bloklanadi.
- SynchronousQueue bloklari va bir ip ma'lumot olishga tayyor bo'lgunga qadar, boshqasi ma'lumotlarni joylashtirishga harakat qiladi.
- SynchronousQueue-da ovoz balandligi yo'q. Ya'ni, unda ma'lumotlar mavjud emas.
- SynchronousQueue oldinga navbat strategiyasini amalga oshirish uchun ishlatiladi, bunda ip nazoratni kutayotgan ipga o'tkazadi yoki ruxsat berilsa, yangisini yaratadi, aks holda boshqaruv o'tkazilmaydi.
- Bu navbat null maʼlumotlarga ruxsat bermaydi. Null elementni qo'shishga urinish NullPointerException ni chiqaradi .
- To'plamdan boshqa usullardan foydalansangiz (masalan, o'z ichiga oladi), SynchronousQueue bo'sh to'plam kabi ishlaydi.
- SynchronousQueue ning peek usulidan foydalana olmaysiz, chunki element faqat uni olib tashlashga harakat qilganingizda mavjud bo'ladi; Bundan tashqari, boshqa ip uni olib tashlashga urinmaguncha, siz elementlarni (har qanday usul yordamida) qo'sha olmaysiz.
- SynchronousQueue uchun iteratordan foydalana olmaysiz, chunki... unda hech qanday elementlar yo'q.
- SynchronousQueue FIFO tartibida iplarga kirish kafolatlangan adolatli qoidalar bilan yaratilishi mumkin.
GO TO FULL VERSION