تجمع الخيوط هو أداة عملية لجمع المهام بالتوازي. مع إدخال بنية متعددة النواة مناسبة للتوازي مع التطبيق ، أصبح دور تجمعات الخيوط واضحًا بشكل متزايد. من خلال فئة Threadpoolexecutor وغيرها من الفصول المساعدة ، قدمت Java 5 هذا الإطار كقسم جديد لدعم التزامن.
إطار Threadpoolexecutor مرن وقوي. وهو يدعم التكوينات الخاصة بالمستخدم ويوفر سنانير وسياسات التشبع ذات الصلة للتعامل مع قوائم الانتظار الكاملة.
سيضع مجموعة خيوط Java المهام المقدمة أولاً في قائمة انتظار العمل والحصول عليها من قائمة انتظار العمل (يتم تقديم Synchronousqueue مباشرة من قبل المنتج إلى مؤشر ترابط العمل). ثم هناك استراتيجيتان للتنفيذ لقوائم العمل: قوائم قوائم غير محدودة وقوائم قوائم محدودة. لا توجد مشكلة في التشبع في قائمة الانتظار غير المحدودة ، ولكن المشكلة هي أنه عندما يستمر الطلب مرتفعًا ، ستتم إضافة المهمة إلى قائمة انتظار العمل بلا دماغ ، مما قد يتسبب في تفاقم الذاكرة والموارد الأخرى. لن تتسبب قوائم الانتظار المحددة في استنفاد الذاكرة الناجم عن ارتفاع الحمل ، ولكن هناك مشكلة في كيفية إدارة المهام المقدمة حديثًا عندما تكون قائمة انتظار العمل ممتلئة. هذه هي المشكلة التي تحتاجها استراتيجية تشبع قائمة الانتظار لتجمع الخيوط.
تنقسم استراتيجيات التشبع إلى: استراتيجية الإجهاض ، واستراتيجية Callerruns ، وتجاهل استراتيجية ، واستراتيجية التخلص من.
من أجل فهم أفضل ، كتبت مثالًا صغيرًا.
حزمة تزامن. سياسات تشبع مختلفة* param معالجات المعالجات مؤشر ترابط التجمع سياسة قائمة الانتظار لاستشبع قائمة قائمة انتظار*//سياسة الفراغ الثابتة العامة (معالج DesideedExecutionHandler). linkedBlockingDeque <> (5)) ؛ if (handler! = null) {exec.setRejectedExecutionHandler (Handler) ؛ // Set Sytress Sybout} لـ (int i = 0 ؛ i <10 ؛ i ++) {exec.submit (مهمة جديدة ()) ؛ // إرسال المهام} exec.shutdown () ؛} threadpoolexecutor.abortpolicy ()) ؛ // السياسة ((threadpoolexecutor.callerrunspolicy ())) ؛ // السياسة (new threadpoolexecutor.discardpolicy () id = 0 ؛ // معرف المهمة المهمة العامة () {id = ++ count ؛}@تجاوز الفراغ العام run () {try {timeUnit.seconds.sleep (3) ؛ // sleep لمدة 3 ثوان} catch (interruptedException e) مؤشر ترابط العامل: " + thread.currentThread (). getName () +" الانتهاء من التنفيذ ") ؛}}} عندما تكون قائمة انتظار العمل ممتلئة ، يتم التعامل مع الاستراتيجيات المختلفة على النحو التالي:
1. السياسة: السياسة الافتراضية. عند تقديم مهمة جديدة ، يتم إلقاء الاستثناء غير المحدد مباشرة. يمكن القبض على الاستثناء من قبل المتصل.
أضف الكود التالي إلى الوظيفة الرئيسية:
السياسة (threadpoolexecutor.abortpolicy ()) ؛
نتيجة العملية هي:
يلقي البرنامج مرفضًا ExecutionException ، ويتم تشغيل ما مجموعه 8 مهام (يمكن تشغيل مجموعة الخيوط 3 مهام في البداية ، ويتم تخزين 5 قوائم في قائمة انتظار العمل). عندما تكون قائمة انتظار العمل ممتلئة ، يتم طرح استثناء مباشرة ، ولا يخرج JVM (لا أعرف السبب الآن). يمكننا أن نرى أن جميع المواضيع التي تنفذ المهام هي مؤشرات ترابط في تجمع الخيوط.
2. استراتيجية Callerruns: بالنسبة لآلية التعديل ، لا تتخلى عن المهام ولا ترمي الاستثناءات ، ولكن العودة إلى المتصل. لم يتم تنفيذ المهمة الجديدة في تجمع الخيوط ، ولكن في الخيط يتصل بالمطوس.
تشغيل في الوظيفة الرئيسية:
السياسة ((threadpoolexecutor.callerrunspolicy ())) ؛
نتائج التشغيل
يتم تشغيل جميع المهام ، ويتم تنفيذ 2 (10 - 3 -5) المهام بنجاح في الخيط الرئيسي ، ويتم تنفيذ 8 مهام بواسطة مؤشرات الترابط في تجمع مؤشرات الترابط.
3. الإستراتيجية المختصرة: يتم التخلي عن المهام المقدمة حديثًا.
تشغيل في الوظيفة الرئيسية
السياسة (ThreadPoolexecutor.DiscardPolicy ()) ؛
تظهر النتائج أعلاه أنه لا يتم إلقاء استثناء ، يتم التخلص من المهام الجديدة المقدمة لاحقًا ، ويتم معالجة المهام 8 (3+5) الأولى فقط ، ويخرج JVM.
4.Discardoldest Strategy: قائمة الانتظار هي مهمة "رئيس الفريق" ثم حاول إرسال مهمة جديدة. (ليست مناسبة لسيناريوهات قائمة انتظار العمل كطابور ذات أولوية)
قم بتشغيل الطريقة التالية في الوظيفة الرئيسية
السياسة (threadpoolexecutor.discardoldestpolicy ()) ؛
نتيجة التشغيل: هناك 8 مهام تعمل في المجموع. ينتهي البرنامج. المهام المضافة لاحقًا هي 9 و 10 ، بينما يتم التخلص من المهام السابقة 3 و 4.
لخص
ما ورد أعلاه هو المحتوى الكامل لهذه المقالة حول مثال الكود لاستراتيجية تشبع قائمة انتظار مجموعة قائمة الانتظار في Java. آمل أن يكون ذلك مفيدًا للجميع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع.