الأمثلة التالية تناقش بشكل أساسي مسألين:
السؤال 1. تم إصلاح تجمع الخيوط في الحجم ، على افتراض أنه 5. ثم كيف يتم تشغيل تأثير تشغيل 10 مؤشرات ترابط في تجمع الخيوط؟ حالة المواضيع الأخرى؟
السؤال 2. فكيف تقوم بإزالة مؤشر ترابط من تجمع مؤشرات الترابط ، أو أن تكون دقيقًا ، لجعل مؤشر ترابط مؤشر ترابط خامل؟
مثال:
حزمة com.dada.executorservice ؛ استيراد java.util.concurrent.timeunit ؛ يمتد jobthread من الفئة العامة مؤشر الترابط {// اسم مؤشر ترابط public jobthread (اسم السلسلة ، threadId long) {super (name) ؛ } Override public void run () {// إذا كان مؤشر الترابط الرئيسي يحتوي على هذا الموضوع ، فسيتم تشغيله بينما (mainThread.ThreadnameMap.containsKey (this.getName ()))) timeUnit.Seconds.sleep (4) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} system.out.println ("**************** ينتهي الموضوع ، اسم الموضوع: ***************" + this.getName ()) ؛ }} حزمة com.dada.executorservice ؛ استيراد java.util.hashmap ؛ استيراد java.util.concurrent.executorservice ؛ استيراد java.util.concurrent.executors ؛ استيراد java.util.concurrent.timeunit ؛ الطبقة العامة mainthread {public static final int threadpool_size = 5 ؛ . // الخريطة المستخدمة لتخزين أسماء مؤشرات الترابط الخريطة الثابتة العامة <string ، string> threadnamemap = new hashmap <string ، string> () ؛ Public Static Void Main (String [] args) {// insert 10 مؤشرات ترابط في تجمع مؤشرات الترابط ، لكن تجمع مؤشرات الترابط يسمح فقط بحد أقصى 5 مؤشرات ترابط ، وبالتالي فإن مؤشرات الترابط 5 الأخرى تنتظر (int i = 0 ؛ i <threadpool_size+5 ؛ i ++) {String threadName (getThReadName (i) ؛ threadnamemap.put (threadname ، threadname) ؛ exec.execute (new Jobthread (threadname ، i)) ؛ } system.out.println ("حجم جدول التجزئة:" + threadnamemap.size ()) ؛ حاول {system.out.println ("الخيط الرئيسي ينام لفترة من الوقت!") ؛ timeUnit.Seconds.sleep (3) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ System.out.println ("Wake Up!") ؛ } // يتم استخدام ما يلي لحذف مؤشرات الترابط في تجمع مؤشر الترابط // removethread (0) ؛ // removethread (1) ؛ // removethread (2) ؛ } void static removethread (int i) {threadnamemap.remove (getThReadName (i)) ؛ System.out.println ("حذف threadThread" + i + "، حجم جدول التجزئة:" + threadnamemap.size ()) ؛ } سلسلة ثابتة عامة getThReadName (int i) {return "threadname"+i ؛ }} قم بتشغيل نتيجة الكود مباشرة:
Threadname: ------ ThreadName0
حجم جدول التجزئة: 10
النوم لفترة من الوقت على الموضوع الرئيسي!
threadname: ------ threadname2
Threadname: ------ Threadname4
threadname: ------ threadname1
threadname: ------ threadname3
Threadname: ------ Threadname4
threadname: ------ threadname2
threadname: ------ threadname3
threadname: ------ threadname1
Threadname: ------ ThreadName0
threadname: ------ threadname1
threadname: ------ threadname3
Threadname: ------ ThreadName0
Threadname: ------ Threadname4
threadname: ------ threadname2
threadname: ------ threadname1
threadname: ------ threadname3
Threadname: ------ Threadname4
ختاماً:
تم العثور عليها المطبوعة: كان اسم الموضوع من ThreadName0 إلى ThreadName4 ، لا يوجد اسم آخر.
ثبت أن 10 مؤشرات ترابط في تجمع الخيوط ، ولكن حجم تجمع الخيوط هو 5 ، ويمكن تخصيص 5 مؤشرات ترابط فقط. الجري هو أول من وضع في تجمع الخيوط ، والمواضيع الأخرى موجودة في الحالة الجاهزة (حالة حظر).
بعد إزالة التعليقات ، يعمل الرمز:
Threadname: ------ ThreadName0
threadname: ------ threadname2
Threadname: ------ Threadname4
حجم جدول التجزئة: 10
النوم لفترة من الوقت على الموضوع الرئيسي!
threadname: ------ threadname1
threadname: ------ threadname3
حذف Thread0 ، حجم جدول التجزئة: 9
حذف Thread1 ، حجم جدول التجزئة: 8
حذف Thread2 ، حجم جدول التجزئة: 7
*************** تنتهي الموضوع ، اسم الموضوع: *********
*************** تنتهي الموضوع ، اسم الموضوع: *********
threadname: ------ threadname5
threadname: ------ threadname6
*************** تنتهي الموضوع ، اسم الموضوع: *********
Threadname: ------ Threadname4
threadname: ------ threadname7
threadname: ------ threadname3
threadname: ------ threadname6
threadname: ------ threadname5
threadname: ------ threadname7
Threadname: ------ Threadname4
threadname: ------ threadname3
threadname: ------ threadname5
threadname: ------ threadname6
threadname: ------ threadname7
Threadname: ------ Threadname4
threadname: ------ threadname3
ختاماً:
من النتائج ، يمكننا أن نرى أنه قبل إزالة الخيط ، لا يزال مؤشر ترابط التشغيل من Thread0 إلى Thread4. بعد إزالة مؤشر ترابط مؤشر ترابط 0 ، يبدأ تشغيل Thread3 الجديد ، ويذهب إلى ThreadName7 بالترتيب.
الملخص كما يلي:
1. تم إصلاح تجمع الخيوط في الحجم ، على افتراض أنه 5. ثم كيف يتم تشغيل تأثير وضع 10 مؤشرات ترابط في تجمع الخيوط؟ حالة المواضيع الأخرى؟
أ. مفهوم تجمع الخيوط هو أنك تستمر في دفع الطلبات إليه ، ولكن يمكنه فقط التعامل مع مؤشرات الترابط مع حصص محددة ، وستنتظر مؤشرات الترابط الإضافية فيه.
ب. عند إكمال أحد مؤشرات الترابط المعالجة (يتم الانتهاء من تنفيذ الأعمال أو أثناء خروج الحلقة) ، سيقوم تجمع مؤشرات الترابط تلقائيًا بإخراج وظيفة من قائمة انتظار الانتظار واستخدام مؤشر ترابط الخمول لتشغيل المهمة. الذي يجب أن يعتمد تجمع الخيوط في تجمع الخيوط الجري على الترتيب الذي يتم وضعه به.
2. إذن كيفية إزالة مؤشر ترابط من تجمع مؤشرات الترابط ، أو أن يكون دقيقًا ، لجعل مؤشر ترابط مؤشر ترابط خمول؟
لا يمكن أن يحصل تجمع الخيوط على أحد المواضيع ويقتله لأن الخيط الرئيسي باستخدام تجمع الخيوط والموضوعات التي يفتحها الخيط الرئيسي على نفس المستوى ، ولا يوجد أحد الحق في السيطرة على بقاء الطرف الآخر. ولكن يمكنك تغيير الطريقة وتحقيق الهدف بطريقة اللباقة.
أ. يحافظ الخيط الرئيسي على جدول التجزئة الذي يمكن أن يكون hashmap. القيمة الرئيسية تعسفية ، ولكن يجب أن تكون فريدة من نوعها ويمكن أن تشير بشكل فريد إلى مؤشر ترابط.
ب. يجب أن تقوم جميع المواضيع الموضوعة في تجمع الخيوط بإنشاء قيمة مفتاح ثم تخزينها في هذا hashmap.
ج. لخيوط فئة الحلقة ، مثل مؤشرات الترابط من بينما (صحيح). يجب إضافة شرط للتحقق مما إذا كان مفتاح هذا الموضوع موجودًا في HashMap أعلاه. الخروج من حلقة الوقت إذا لم تكن موجودة.
د. على الرغم من أن الخيط الرئيسي لا يمكن أن يهيمن على بقاء الخيوط الأخرى ، إلا أنه يمكنه وضع أو إزالة hashmap الخاص به. في هذه المرحلة ، طالما تتم إزالة قيمة المفتاح المقابلة للمعلومات من HashMap ، سيتم الخروج تلقائيًا في المرة التالية التي يحلق فيها.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.