ما هو BlockingQueue في Java وكيف يتم تنفيذه؟



ستساعدك هذه المقالة حول BlockingQueue في Java على التعرف على واجهة BlockingQueue. سوف يمنحك أيضًا نظرة ثاقبة حول أساليبها وتنفيذها العملي

تحظى بشعبية كبيرة بين المبرمجين بسبب مجموعتها الشاملة من الميزات المضمنة. في معظم الأوقات سيكون لديك حل مخصص لمشكلتك حتى قبل ظهورها. هذا جزء مفيد للغاية ومهم من هي واجهة BlockingQueue في Java. من خلال وسيط هذه المقالة ، سألقي بعض الضوء على BlockingQueue في Java وطرق تنفيذه.

اذهب فرز c ++

فيما يلي الموضوعات التي تم تناولها في هذه المقالة:





واجهة قائمة الانتظار في جافا

قائمة انتظار في جافا هي واجهة تمت إضافتها في Java 1.5 مع بعض فئات الأدوات المساعدة المتزامنة الأخرى مثل ConcurrentHashMap و CopyOnWriteArrrayList وما إلى ذلك ، تنتمي واجهة BlockingQueue إلى java.util.concurrent صفقة .تعمل هذه الواجهة على تحسين التحكم في التدفق عن طريق تنشيط الحظر ، في حالة محاولة أحد الخيوط إزالة قائمة انتظار فارغة أو إدراج قائمة انتظار كاملة في قائمة انتظار. في كلتا الحالتين ، تكون هذه الواجهة سهلة الاستخدام.بعبارات أبسط ، افترض أن أ يحاول إضافة عناصر إلى قائمة انتظار كاملة بالفعل. في هذه المرحلة من البرنامج ، سيتم استدعاء BlockingQueue والذي سيؤدي إلى حظر هذا الخيط المحدد حتى يقوم مؤشر ترابط آخر بإصدار قائمة الانتظار لتوفير مساحة. يمكن أن يكون هذا نتيجة إما إلغاء ترتيب عنصر (عناصر) لتصفية قائمة الانتظار بأكملها. وبالمثل ، سيتم استدعاء BlockingQueue لحظر مؤشر ترابط يحاول إلغاء قائمة انتظار فارغة بالفعل حتى يتم إدراج بعض الخيوط الأخرى أو إضافة عنصر إلى فارغ طابور .

أثناء العمل مع واجهة BlockingQueue في Java ، يجب أن تتذكر أنها لا تقبل قيمة خالية. في حالة محاولة القيام بذلك ، فسوف يقوم على الفور بإلقاء NullPointerException. يمثل الشكل أدناه عمل واجهة BlockingQueue في Java.



BlockingQueue - BlockingQueue في Java - Edurekaهذه واجهه المستخدم يستخدم بشكل أساسي بين المنتجين والمستهلكين لأنه آمن في الخيط.ما أعنيه هو أنه يمكن استخدام واجهة BlockingQueue لإنشاء قائمة انتظار يمكن مشاركتها من قبل كل من المنتج والمستهلك

من أجل العمل مع BlockingQueue في Java ، تحتاج أولاً إلى التعرف على أنواعها. اسمحوا لي أن أقدم لكم في القسم التالي من هذه المقالة.

أنواع المنشئات لحظر قائمة الانتظار في جافا

هناك نوعان من المنشئات لواجهة BlockingQueue في Java:



  • قائمة انتظار غير محدودة: بالنسبة لهذا النوع من قائمة الانتظار ، سيتم تعيين السعة على عدد صحيح. MAX_VALUE. لن يتم حظر قائمة انتظار غير محدودة أبدًا لأنها يمكن أن تنمو ديناميكيًا ، في كل مرة يتم إدراج عنصر فيها. يوجد أدناه بناء الجملة لإنشاء قائمة انتظار غير محدودة:
BlockingQueue bq = new LinkedBlockingDeque ()
  • قائمة الانتظار المحدودة: بالنسبة لهذا النوع من قائمة الانتظار ، تحتاج إلى تمرير سعة قائمة الانتظار في وقت إنشائها ، أي باني معامل. بمجرد تعيين الحجم ، لا يمكن تغييره. يوجد أدناه بناء الجملة لإنشاء قائمة انتظار محدودة:
BlockingQueue bq = جديد LinkedBlockingDeque (10)

الآن بعد أن أصبحت معتادًا على طرق تنفيذ BlockingQueue في Java ، دعني أسرد بعضًا من أساليبها.

الطرق في حظر واجهة قائمة الانتظار

طريقة وصف
إضافة منطقية (هـ هـ) تساعد هذه الطريقة في إدراج العنصر المحدد في قائمة الانتظار هذه إذا كان هناك مساحة في قائمة الانتظار وإلا فسيتم ذلكرمياستثناء الدولة غير القانوني
قيمة منطقية تحتوي على (كائن o) ترجع هذه الطريقة صحيحًا إذا كانت قائمة الانتظار تحتوي على العنصر المحدد
استنزاف داخلي (مجموعة ج) ستزيل هذه الطريقة جميع العناصر المتاحة من قائمة الانتظار وإضافتها إلى المجموعة المحددة
استنزاف int (مجموعة c ، int maxElements) ستزيل هذه الطريقة عند العدد المحدد من العناصر المتاحة من قائمة الانتظار وإضافتها إلى المحدد
عرض منطقي (هـ هـ) ستقوم هذه الطريقة بإدراج العنصر المحدد في قائمة الانتظار إذا لم يكن ممتلئًا وإرجاع القيمة true ، وإلا فسيعود خطأ
عرض منطقي (E e، long timeout، TimeUnit unit) ستدرج هذه الطريقة العنصر المحدد في قائمة الانتظار. في حالة امتلاء قائمة الانتظار ، ستنتظر حتى وقت الانتظار المحدد حتى تصبح المساحة متاحة.
استطلاع E (مهلة طويلة ، وحدة TimeUnit) تساعد هذه الطريقة في استرداد رأس قائمة الانتظار وإزالتها. إذا كانت قائمة الانتظار فارغة ، فستنتظر حتى وقت الانتظار المحدد حتى يصبح العنصر متاحًا
وضع باطل (هـ هـ) ستقوم هذه الطريقة بإدراج العنصر المحدد في قائمة الانتظار عن طريق انتظار توفر مساحة في حالة امتلاء قائمة الانتظار
كثافة العمليات المتبقية تساعد هذه الطريقة في إرجاع عدد العناصر الإضافية التي يمكن لقائمة الانتظار هذه قبولها بشكل مثالي دون حظر
إزالة منطقية (كائن o) ستزيل هذه الطريقة مثيلًا واحدًا للعنصر المحدد من قائمة الانتظار فقط إذا كان موجودًا
E تأخذ () ستساعد هذه الطريقة في استرداد رأس قائمة الانتظار وإزالتها من خلال انتظار توفر عنصر ، في حال كانت قائمة الانتظار فارغة.

حظر تطبيقات قائمة الانتظار

هنا سأقوم بتنفيذ مثال بسيط من BlockingQueue في Java حيثسيقوم class EduProducer بإنشاء البيانات وإدخالها في ملف طابور في نفس الوقت ، سيقوم فصل آخر ، EduConsumer ، بإزالة البيانات من نفس قائمة الانتظار.

لهذا سوف أقوم بإنشاء 3 فصول وهي:

  1. EduProducer
  2. EduConsumer
  3. اديوريكا

دعنا الآن ننشئ كل فئة من هذه الفئات واحدة تلو الأخرى.

EduProducer.java

package edureka import java.util.concurrent.BlockingQueue public class EduProducer تنفذ Runnable {private final BlockingQueue queueOverride public void run () {try {process ()} catch (InterruptException e) {Thread.currentThread (). } عملية الفراغ الخاصة () تطرح InterruptException {// ضع 10 ints في قائمة الانتظار لـ (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

package edureka import java.util.concurrent.BlockingQueue public class EduConsumer تنفذ Runnable {private final BlockingQueue queueOverride public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptException e) {Thread.currentThread (). interrupt ()}} تطرح عملية الفراغ الخاصة (عدد صحيح) InterruptException {System.out.println ('[المستهلك] إزالة:' + أخذ) Thread.sleep (500)} عام EduConsumer (BlockingQueue queue) {this.queue = queue}}

EdurekaMain.java

package edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer) (queue) .start () موضوع جديد (EduConsumer جديد (قائمة انتظار)). start ()}}

بمجرد الانتهاء من كتابة الكود ، قم بتنفيذ البرنامج للحصول على الإخراج أدناه:

[منتج] أضف: 0 [مستهلك] خذ: 0 [منتج] سعة قائمة الانتظار المتبقية: 9 [منتج] أضف: 1 [منتج] سعة قائمة الانتظار المتبقية: 9 [منتج] أضف: 2 [منتج] سعة قائمة الانتظار المتبقية: 8 [منتج ] إضافة: 3 [المنتج] سعة قائمة الانتظار المتبقية: 7 [المستهلك] خذ: 1 [المنتج] أضف: 4 [المنتج] سعة قائمة الانتظار المتبقية: 7 [المنتج] إضافة: 5 [المنتج] سعة قائمة الانتظار المتبقية: 6 [المنتج] أضف : 6 [المنتج] سعة قائمة الانتظار المتبقية: 5 [المستهلك] خذ: 2 [المنتج] أضف: 7 [المنتج] سعة قائمة الانتظار المتبقية: 5 [المنتج] أضف: 8 [المنتج] قدرة قائمة الانتظار المتبقية: 4 [المنتج] أضف: 9 [المنتج] القدرة المتبقية في قائمة الانتظار: 3 [المستهلك] خذ: 3 [المستهلك] خذ: 4 [المستهلك] خذ: 5 [المستهلك] خذ: 6 [المستهلك] خذ: 7 [المستهلك] خذ: 8 [المستهلك] خذ: 9

هذا يقودنا إلى نهاية هذه المقالة حول BlockingQueue في Java. إذا كنت ترغب في تعلم Java بمزيد من التفاصيل ، يمكنك الرجوع إلى موقعنا كذلك.

الآن بعد أن فهمت أساسيات BlockingQueue في Java ، تحقق من ملف من Edureka ، شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250.000 متعلم راضٍ منتشرين في جميع أنحاء العالم تم تصميم دورة Edureka's Java J2EE and SOA للتدريب والشهادة للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java. تم تصميم الدورة التدريبية لمنحك بداية قوية في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في 'قائمة الحظر في Java' وسنقوم بالرد عليك في أقرب وقت ممكن.