JavaRush /Java blogi /Random-UZ /Java-dagi SynchronousQueue misoli - ishlab chiqaruvchi is...
profeg
Daraja

Java-dagi SynchronousQueue misoli - ishlab chiqaruvchi iste'molchi muammosini hal qilish

Guruhda nashr etilgan
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 - 1Yuqorida aytib o'tganimdek, har qanday dasturlash tilida iplararo aloqani tushunish uchun ishlab chiqaruvchi-iste'molchi muammosidan yaxshiroq narsa yo'q . Bu masalada bir ip voqea va topshiriqlarni ishlab chiqaruvchi ishlab chiqaruvchi, ikkinchi ip esa uning iste’molchisi vazifasini bajaradi. Umumiy bufer ishlab chiqaruvchidan iste'molchiga ma'lumotlarni uzatish uchun ishlatiladi. Ushbu muammoni hal qilishning qiyinligi ekstremal holatlarda, masalan, ishlab chiqaruvchi kutishga majbur bo'lganda, chunki... bufer to'lgan yoki iste'molchi kutishga majbur, chunki bufer bo'sh. Bu osonlik bilan hal qilindi, chunki ... Bloklash navbati nafaqat ma'lumotlarni saqlash uchun buferni, balki oqimni boshqarishni ham ta'minladi, agar bufer to'lgan bo'lsa, put() usulini (Producer) chaqiruvchi ipni bloklaydi va agar bufer to'lgan bo'lsa, take() usulini (Consumer) chaqiruvchi ipni bloklaydi. bufer bo'sh edi. Endi biz xuddi shu muammoni SynchronousQueue, nol sig'imga ega parallel to'plamlarning maxsus turi yordamida hal qilamiz . Quyidagi misolda bizda PRODUCER va CONSUMER ( har doim iplarga nom bering , bu ko'p tarmoqli dasturlashning juda yaxshi uslubi).Birinchi ip o'yindagi ballni joylashtiradi, ikkinchi ip esa uni sarflaydi. O'yindagi ball String tipidagi ob'ektdan boshqa narsa emas. Ammo dasturni boshqa turda ishga tushirsangiz, hech qanday farq sezmaysiz. SynchronousQueue qanday ishlashini va ishlab chiqaruvchi-iste'molchi muammosini qanday hal qilishni tushunish uchun sizga kerak bo'ladi: yoki Eclipse muhitida disk raskadrovka (disk raskadrovka) dasturini ishga tushiring yoki shunchaki customer.start(); agar iste'molchi ipi ishlamayotgan bo'lsa, ishlab chiqaruvchi ip queue.put(event) da bloklanadi; ishlayotgan bo'lsangiz, prodyuser [PRODUCER] :FOUR tadbirini nashr etayotganini ko'ra olmaysiz. Bu sodir bo'ladi, chunki SynchronousQueue ning o'ziga xos xatti-harakati, bu boshqa mavzu ma'lumotlarni olguncha va aksincha, mavzuni joylashtirish ma'lumotlarining bloklanishini ta'minlaydi. Kodning qolgan qismini ishlab chiqaruvchi.start(); va faqat iste'molchi ipni boshlash. Agar siz dastur nima chiqishini diqqat bilan o'rgansangiz, chiqish tartibi teskari ekanligini sezasiz. Ko‘rinishidan, [CONSUMER] tarmog‘i ma’lumotlarni [PRODUCER] ishlab chiqarishdan oldin oldi. Buning sababi, SynchronousQueue sukut bo'yicha navbatda turishni kafolatlamaydi. Ammo u FIFO tartibida iplarga kirishni o'rnatadigan adolat qoidalariga ega. Haddan tashqari yuklangan SynchronousQueue konstruktoriga quyidagi tarzda oʻtish orqali ushbu qoidalarni yoqishingiz mumkin : 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.

  1. SynchronousQueue bloklari va bir ip ma'lumot olishga tayyor bo'lgunga qadar, boshqasi ma'lumotlarni joylashtirishga harakat qiladi.
  2. SynchronousQueue-da ovoz balandligi yo'q. Ya'ni, unda ma'lumotlar mavjud emas.
  3. 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.
  4. Bu navbat null maʼlumotlarga ruxsat bermaydi. Null elementni qo'shishga urinish NullPointerException ni chiqaradi .
  5. To'plamdan boshqa usullardan foydalansangiz (masalan, o'z ichiga oladi), SynchronousQueue bo'sh to'plam kabi ishlaydi.
  6. 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.
  7. SynchronousQueue uchun iteratordan foydalana olmaysiz, chunki... unda hech qanday elementlar yo'q.
  8. SynchronousQueue FIFO tartibida iplarga kirish kafolatlangan adolatli qoidalar bilan yaratilishi mumkin.
Ehtimol, bu Java-dagi SynchronousQueue haqidadir . Biz ushbu ko'p tarmoqli to'plamning ba'zi bir maxsus xususiyatlarini ko'rib chiqdik va Java'da SynchronousQueue yordamida klassik ishlab chiqaruvchi-iste'molchi muammosini qanday hal qilishni o'rgandik. Aytgancha, uni Navbat deb atash mutlaqo to'g'ri emas, chunki... unda elementlar mavjud emas. put() ga qo'ng'iroq boshqa tel chaqiruvi take()gacha tugamaydi. Buni iplarning uchrashadigan joyi, ular bir ob'ektni bo'lishish joyi deb hisoblash to'g'riroq. Boshqacha qilib aytadigan bo'lsak, bu Java-da ob'ektlarni sinxronlashtirilgan uzatish uchun yordamchi dastur, ehtimol kutish va xabar berish usuliga xavfsizroq alternativadir .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION