Java Thread Pool ExecutorService
1. تجمع الموضوع
1.1 تحت أي ظروف تستخدم تجمع الخيوط؟
1.2 فوائد استخدام تجمعات الخيوط
2.executorservice والمنفذون
2.1 مقدمة
ExecutorService هي واجهة ترث المنفذ ،
الواجهة العامة executorservice تمديد المنفذ {}المنفذ هو أيضًا واجهة ، والتي تحتوي فقط على طريقة واحدة:
الواجهة العامة executor {void execute (runnable command) ؛} الواجهة العليا من تجمع مؤشرات الترابط في Java هي Excutor ، ولكن بالمعنى الدقيق للكلمة >> Exector ليس تجمع مؤشرات ترابط ، ولكن مجرد أداة لتنفيذ مؤشرات الترابط. واجهة البركة الحقيقية> البلياردو هي شركة ExecutorService.
3.executors
إنها فئة مصنع ثابتة ، والتي يمكن أن تنتج أنواعًا مختلفة من تجمعات الخيوط ، وبعض رموز المصدر هي كما يلي:
منفذ الطبقة العامة {// newfixedThreadPoolpublpublupublp static eventorservice newfixedthreadpool (int nthreads) {return new threadpoolexecutor (nthreads ، nthreads ، 0L ، timeUnit.milliseConds ، new LinkedBlockingqueue <Runnable> ()) ؛ newCacheDthReadPool () {return new threadpoolexecutor (0 ، integer.max_value ، 60l ، timeunit.seconds ، متزامن جديد <Runnable> ()) ؛ } // newscheduledthreadpool static static scredexecutorservice newscheduledthreadpool (int corepoolsize) {return new SecretThreadPoolexecutor (corepoolsize) ؛ } // newstringooo}دعونا أولاً نلقي نظرة على مثال محدد ونستخدم أمثلة لتوضيح أوجه التشابه والاختلاف بينهما.
Package Thread ؛ import java.util.concurrent.executorservice ؛ import java.util.concurrent.executors ؛ import java.util.concurrent.schedexecutorservice ؛/*** التي تم إنشاؤها بواسطة yang في 16-7-11. */public class ch09_executor {private static void run (ExecutorService threadpool) {for (int i = 1 ؛ i <5 ؛ i ++) {final int taskid = i ؛ threadpool.execute (new runnable () {Override public void run () {for (int i = 1 ؛ i <5 ؛ i ++) {try {thread.sleep (20) ؛} catch (interruptedException e) { threadpool.shutdown () ؛ بركة مؤشر ترابط واحد. Run (flexThreadPool) ؛ // (2) // Run (SingleThreadPool) ؛ // (3) // Run (ScreduleThReadPool) ؛ // (4)}}4. 4 تجمعات الخيوط شائعة الاستخدام
4.1 مخزنة
سيقوم CacheDthreadPool بإنشاء منطقة ذاكرة التخزين المؤقت التي تقوم بتخزين مؤشر ترابط تهيئة ، وينتهي وتزيل الخيوط التي لم يتم استخدامها لمدة 6 ثوانٍ من ذاكرة التخزين المؤقت.
إذا كان الخيط متاحًا ، فاستخدم الخيط الذي تم إنشاؤه من قبل. إذا لم يكن الخيط متاحًا ، فقم بإنشاء موضوع جديد.
. راجع:
حمام سباحة من نوع ذاكرة التخزين المؤقت ، تحقق أولاً مما إذا كانت هناك مؤشرات ترابط تم إنشاؤها في المجمع. إذا كان هناك واحد ، أعد الاستخدام. إذا لم يكن هناك أحد ، فقم بإنشاء موضوع جديد وأضفه إلى حمام السباحة.
استخدم السيناريوهات:
عادةً ما تُستخدم تجمعات ذاكرة التخزين المؤقت لأداء بعض المهام غير المتزامنة مع العمر القصير ، لذلك لا يتم استخدامها كثيرًا في بعض الخوادم الموجهة نحو الاتصال.
نفذ الوقت:
يجب أن يكون الخيط الذي يمكن إعادة استخدامه مؤشر ترابط في التجمع داخل المهلة الخاملة. المهلة الافتراضية هي الستينيات. إذا تم تجاوز مدة هذا الخمول ، فسيتم إنهاء مثيل الخيط وسيتم إزالة التجمع.
ينهي:
الخيط الذي وضعه في المخزون المخبوق لا داعي للقلق بشأن نهايته. إذا كان غير نشط بعد مهلة ، فسيتم إنهائه تلقائيًا.
مثال على التوضيح:
إزالة تعليقات (2) وتشغيلها. نتيجة العملية على النحو التالي:
أول مرة من المهمة الأولى ، المرة الثالثة من المهمة الثالثة ، المرة الثالثة من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من آخر مرة في المرة الثانية من المرة الثانية من الوقت الثاني. وقت المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من المرة الثانية من الوقت الثاني من المرة الثانية من الوقت الثاني من الوقت الثاني من الثانية من الوقت الثاني من الثانية من الوقت الثاني من آخر مرة في المرة الثانية من المرة الثانية من الوقت الثاني من آخر مرة. المرة الثانية للمرة الثانية للمرة الثانية للمرة الثانية للمرة الثانية من المرة الثانية للمرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الرابعة من المرة الرابعة من المرة الرابعة من الموعد الرابع ، في المدة الرابعة من المدة الرابعة ، الوقت الرابع من المرة الرابعة للمهمة الأولى ، والمرة الرابعة للمرة الرابعة من المهمة الأولى ، والمرة الرابعة للمرة الرابعة من المهمة الأولى ، والوقت الرابع في المرة الرابعة من المرة الرابعة من المركز الرابع من المركز الرابع ، وهو المركز الرابع في المركز الرابع في المرتبة الرابعة في المدة الرابعة من المدة الرابعة من المدة الرابعة من المدة الرابعة من المدة الرابعة في المرتبة الرابعة في المرتبة الرابعة في المرتبة الرابعة في المرتبة الرابعة في المرتبة الرابعة في المرتبة الرابعة في المرتبة الرابعة في المرحلة الرابعة. الوقت الرابع من الوقت الرابع للمرة الرابعة من المهمة الأولى ، والمرة الرابعة للمرة الرابعة من المهمة الأولى ، والمرة الرابعة للمرة الرابعة للمرة الرابعة من المهمة الأولى ، والمرة الرابعة للمرة الرابعة من المرة الرابعة من المهمة الأولى ، وهي المرة الرابعة
من النتائج ، يمكن ملاحظة أن المهام الأربع يتم تنفيذها بالتناوب.
4.2fixedThreadPool
في الثابتة ، هناك حمام سباحة ثابت ،
إذا كانت المهام تحتاج حاليًا إلى تنفيذها تتجاوز حجم المسبح ، فستكون العديد من المهام الصادرة في حالة انتظار حتى يكون هناك مؤشرات ترابط مجانية لتنفيذ المهام.
إذا كانت المهمة المطلوبة حاليًا تنفيذها أصغر من حجم المسبح ، فلن يتم تدمير مؤشر ترابط الخمول.
إعادة الاستخدام:
يشبه FlexThreadPool CachethreadPool ، ويمكن أيضًا استخدامه إذا كان يمكن إعادة استخدامه ، لكن لا يمكنك إنشاء مؤشرات ترابط جديدة في أي وقت.
رقم ثابت
تفرده هو أنه في أي وقت ، يمكن أن يكون هناك عدد ثابت من الخيوط النشطة فقط. في هذا الوقت ، إذا كان هناك مؤشر ترابط جديد يجب إنشاؤه ، فلا يمكن وضعه إلا في قائمة انتظار أخرى والانتظار حتى ينتهي الخيط في الخيط الحالي ويتم نقله من المسبح مباشرة.
نفذ الوقت:
على عكس Cachethreadpool ، لا يحتوي FixedThreadPool على آلية خاملة
استخدم السيناريوهات:
لذلك ، يستهدف معظم الفواصل الثابتة بعض الخيوط المتزامنة المستقرة والثابتة للغاية ، ويستخدم في الغالب في الخوادم
تحليل رمز المصدر:
انطلاقًا من الكود المصدري للطريقة ، فإن تجمع ذاكرة التخزين المؤقت ومجموعة التجمع الثابتة تستدعي نفس تجمع الأساس ، لكن المعلمات مختلفة.
تم إصلاح عدد مؤشرات ترابط البركة الثابتة وهو 0 ثانية الخمول (بدون خمول)
يدعم عدد مؤشرات ترابط تجمع ذاكرة التخزين المؤقت 0-ineger.max_value (من الواضح أن تحمل موارد المضيف لا يعتبر على الإطلاق) ، 60 ثانية خاملة
مثال على التوضيح:
قم بإزالة تعليقات (1) ، والنتيجة الجارية هي كما يلي:
أول مرة من المهمة الأولى ، المرة الثالثة من المرة الثالثة من المهمة الأولى ، المرة الثالثة من المرة الثانية من المهمة الثانية ، المرة الثالثة من المرة الثانية من المرة الثانية من المهمة الثانية من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني من الوقت الثاني. وقت المرة الثانية من المرة الثانية للمرة الثانية للمرة الثانية من المرة الثانية للمرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الثانية من المرة الرابعة من المرة الرابعة من المرة الرابعة من المرة الرابعة من المرة الرابعة من المرة الرابعة من المرة الرابعة من المرة الرابعة من الرابع من المرة الرابعة من المركز الرابع الرابع من المركز الرابع الرابع من المركز الرابع الرابع من المركز الرابع. الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من المدة الرابعة من الوقت الرابع من الوقت الرابع من المركز الرابع من الرابع من الرابع من المركز الرابع من الرابع من المركز الرابع الرابع في المرتبة الرابعة الرابعة من الرابع في المركز الرابع الرابع في المرتبة الرابعة الرابعة من الرابع في المرتبة الرابعة. من المرة الرابعة من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من المدة الرابعة من المدة الرابعة من الوقت الرابع من الوقت الرابع من الوقت الرابع من الرابع من المدة الرابعة من المركز الرابع من الرابع من المدة الرابعة من الرابع من الموعد الرابع الرابع من الرابع في المركز الرابع الرابع من الرابع من المدة الرابعة. الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من الوقت الرابع من المدة الرابعة من الوقت الرابع من الوقت الرابع من المركز الرابع من الرابع من الرابع من المركز الرابع من الرابع من المركز الرابع الرابع في المرتبة الرابعة الرابعة من الرابع في المركز الرابع الرابع في المرتبة الرابعة الرابعة من الرابع في المرتبة الرابعة. من المرة الرابعة
تم إنشاء تجمع خيوط بحجم ثابت بسعة 3 ، ثم تم تنفيذ 4 مهام في حلقة. من نتائج الإخراج ، يمكن ملاحظة أن المهام الثلاث الأولى تم تنفيذها أولاً ، ثم قامت مؤشرات الترابط الخاطفة بالمهمة الرابعة.
4.3singlethreadexecutor
إزالة (3) التعليقات. انظر نتيجة التنفيذ على النحو التالي:
المهمة الأولى للمهمة الأولى للمهمة الأولى للمهمة الثانية للمهمة الأولى للمهمة الثالثة للمهمة الأولى للمهمة الرابعة للمهمة الثانية للمهمة الثانية للمهمة الثانية للمهمة الثانية للمهمة الثالثة للمهمة الثالثة للمهمة الثالثة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة من المهم الرابع من المهم الرابع من المهم الرابع من المهم الرابع من المهم الرابع من المهم الرابع من المهم الرابع من المهم. المهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة للمهمة الرابعة الرابعة
يتم تنفيذ المهام الأربع بالتتابع.
4.4 جدولة
ScredultHreadPool هو تجمع خيوط بحجم ثابت. على غرار الثابتة ، فإن المهام التي تم تنفيذها هي مهام محددة.
النتيجة التي تم الحصول عليها عن طريق إزالة شرح (4) هي نفس النتيجة التي تم الحصول عليها بواسطة ثابت. السبب الرئيسي لـ ScredulThReadPool ليس هنا ، ولكن مهمة محددة. انظر المثال التالي:
Package Thread ؛ import java.util.concurrent.executors ؛ import java.util.concurrent.ScheduleDexecutorService ؛ import java.util.concurrent.timeunit ؛/*** تم إنشاؤه بواسطة Yang في 16-7-11. */الفئة العامة myscheduledTask تنفذ Runnable {private string tname ؛ myscheduledTask العامة (اسم السلسلة) {this.tname = name ؛ } public void run () {system.out.println (tname+"تنفيذ تأخير المهمة 2 ثانية!") ؛ } public static void main (string [] args) {ScripedExecutorService ScheduledPool = Executors.NewScheduleDthReadPool (2) ؛ ScheduledExecutorService SingschedulePool = Executors.NewSingleThreadScheduleDexecutor () ؛ myscheduledtask mt1 = جديد myscheduledtask ("mt1") ؛ myscheduledtask mt2 = جديد myscheduledtask ("mt2") ؛ // ابدأ مهمة MT1 مع SecrledThreadPool لتنفيذ SignedPool.Schedule (MT1،2 ، TimeUnit.Seconds) ؛ // ابدأ MT2 مع SinglescheduledThreadPool ؛ SingschedulePool.Schedule (MT2،2000 ، timeUnit.milliseconds) ؛ ScheduledPool.shutdown () ؛ SingschedulePool.shutdown () ؛ }}نتيجة:
MT1 مهمة التأخير 2 ثانية للتنفيذ! MT2 مهمة التأخير 2 ثانية للتنفيذ!
لن يتم عرض النتيجة بعد تشغيل البرنامج لمدة ثانيتين ، مما يشير إلى أنه تم تنفيذ مؤشر الترابط بعد ثانيتين.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!