عدة طرق لتنفيذ المنتج ونموذج المستهلك
خذ المثال في حياتنا كمثال. يتم دائمًا تصدير المنتجات التي تنتجها المصانع لاستخدامها في الخارج. هذا هو مفهوم الإنتاج والاستهلاك.
في عملية تطوير البرمجيات الفعلية الخاصة بنا ، نواجه في كثير من الأحيان السيناريوهات التالية: الوحدة النمطية مسؤولة عن إنشاء البيانات ، ويتم معالجة هذه البيانات بواسطة وحدة أخرى (الوحدة هنا معممة ، والتي يمكن أن تكون فئات ، وظائف ، مؤشرات الترابط ، العمليات ، إلخ).
تسمى الوحدة النمطية التي تنشئ البيانات بوضوح المنتج ؛ في حين أن الوحدة النمطية التي تعالج البيانات تسمى المستهلك.
النوع الأول: استخدم انتظار الانتظار لتنفيذ نموذج المنتج ونموذج المستهلك
1. منتج ومستهلك:
2. منتج واحد ومستهلكين متعددين:
النوع الثاني: استخدام قوائم انتظار الحظر لتنفيذ المنتج ونموذج المستهلك
3. استخدم قوائم الانتظار لتنفيذ نمط المنتج المستهلك
أعتقد أن الجميع ذهبوا إلى المطبخ الياباني. هناك وجبة جذابة للغاية الشواء. سيقف سيد الشواء على الجانب ويحافظ على الشواء ، ثم يضع اللحم المحمص على طبق ؛ وسوف نجلس على الجانب الذي يسيل لعابه ، وسنستمر في تناول الطعام طالما أن هناك لحم على الطبق.
في حالة الحياة هذه ، فإن ماجستير الشواء هو المنتج ، وهو مسؤول عن الشواء. بعد التحميص ، يضع اللحم على الطبق بدلاً من تسليمه مباشرة إلى العشاء (أي ، ليست هناك حاجة لإخطار العشاء بتناول اللحوم). إذا كان اللحم على اللوحة ممتلئًا ، فسيتوقف السيد لفترة من الوقت حتى يذهب شخص ما لتناول الشواء قبل إنتاج اللحم ؛ ويحدق داينرز فقط في اللوحة ، وبمجرد وجود اللحوم على اللوحة ، نحن مسؤولون عن تناوله ؛
خلال العملية بأكملها ، لم يتعامل داينرز وماجستير الشواء مع بعضهما البعض مباشرة ، ولكن تفاعل مع اللوحة.
اللوحة تعمل كمفهوم عازلة. إذا تم إنتاج شيء ما ، فضعه فيه. تحتوي اللوحة أيضًا على حد حجم الحجم. إذا تجاوز حجم اللوحة ، فسوف يمنع إنتاج المنتج وينتظر حتى يستهلك المستهلك ؛ عندما تكون اللوحة فارغة ، فإنها ستمنع استهلاك المستهلك وانتظر إنتاج المنتج.
يمكن لحظر قائمة الانتظار أثناء البرمجة إدراك وظيفة القرص.
خصائص منع طوابير:
عندما يكون عنصر قائمة الانتظار ممتلئًا ، قم بحظر عملية الإدراج ؛
عندما يكون عنصر قائمة الانتظار فارغًا ، يتم حظر عملية الاستحواذ.
كل من ArrayBlockingQueue و LinkedBlockingqueue FIFO (الأول في ، أولاً خارج) ، ولكن LinkedBlockingeue غير محدود ، في حين أن ArrayBlockingqueue محدود.
ما يلي يستخدم طوابير حظر لتنفيذ المنتجين والمستهلكين:
منتج:
استيراد java.util.concurrent.blockingqueue ؛ منتج الطبقة العامة ينفذ Runnable {private Final Blockingqueue blockingqueue ؛ // اضبط حجم ذاكرة قائمة انتظار قائمة الانتظار. سيتم إيقاف الإنتاج مؤقتًا بعد تجاوز هذا الحجم أثناء عملية الإنتاج. Queue_size النهائي الخاص = 10 ؛ منتج عام (blockingqueue blockingqueue) {this.blockingqueue = blockingqueue ؛} int task = 1 ؛ override public void run () {while (true) {try {{task.out.println ("production:" task) ؛ // ضع المنتج المنتج في قائمة الانتظار ({task) لتسهيل عرض مؤثر التأثير.مستهلك:
استيراد java.util.concurrent.blockingqueue ؛ // المستهلك المستهلك المستهلك العام ينفذ Runnable {blockingqueue final plockingqueue ؛ المستهلك العام (blockingqueue blockingqueue) {this.blockingqueue = blockeue ؛ {system.out.println ("الاستهلاك:" + blockingqueue.take ()) ؛ // دعها تتوقف لفترة من الوقت لتسهيل عرض مؤثر التأثير.امتحان:
استيراد java.util.concurrent.blockingqueue ؛ استيراد java.util.concurrent.linkedblocking ؛/** * وضع المستهلك المنتج * استخدم طابور الحظر = منتج جديد (blockingqueue) ؛ المستهلك C = مستهلك جديد (blockingqueue) ؛ مؤشر ترابط TP = مؤشر ترابط جديد (P) ؛ مؤشر ترابط TC = مؤشر ترابط جديد (C) ؛ tp.start () ؛
نظرًا لأن LinkedBlockingQueue عبارة عن قائمة انتظار غير محدودة ، فسيستمر المنتجون في إنتاج المهام المنتجة في قائمة الانتظار ، وسيستهلك المستهلكون في قائمة الانتظار:
إذا كنت تستخدم ArrayBlocking arrayblocking arrayblocking من الحظر بدلاً من ذلك ، فيمكنك تهيئة حجم قائمة الانتظار. ثم عندما تتجاوز العناصر الموجودة في قائمة الانتظار حجم قائمة الانتظار ، سينتظر المنتج حتى يستهلك المستهلك واحدًا ثم ينتج الآخر:
رمز الاختبار:
تهيئة arrayblockingqueue من الحجم 10:
MAIN الفراغ الثابت العام (سلسلة [] args) {blockingqueue blockingqueue = جديد arrayblockingqueue (10) ؛ منتج p = منتج جديد (blockingqueue) ؛ المستهلك c = مستهلك جديد (blockingqueue)خلال الاختبار ، سُمح للمنتجين بإنتاج أسرع قليلاً ، بينما كان المستهلكون أبطأ. يمكنك أن ترى أن الفرق بين الرقم التسلسلي للمنتج المنتجة والرقم التسلسلي للمنتج المستهلك هو دائمًا 10 (حجم قائمة الانتظار):
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول طريقة التنفيذ لنموذج المستهلك الإنتاج وأمثلة رمز لمشكلات سلامة مؤشرات الترابط. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!