1. مقدمة
الاستخدام العقلاني لمتجمعات الخيوط يمكن أن يجلب ثلاث فوائد. أولاً: تقليل استهلاك الموارد. تقليل الاستهلاك الناجم عن إنشاء الخيط وتدميره عن طريق إعادة استخدام المواضيع التي تم إنشاؤها. ثانياً: تحسين سرعة الاستجابة. عند وصول المهمة ، يمكن تنفيذ المهمة فور إنشاء مؤشر الترابط. ثالثًا: تحسين إمكانية إدارة الموضوع. المواضيع هي الموارد النادرة. إذا تم إنشاؤها بشكل غير محدود ، فلن تستهلك موارد النظام فحسب ، بل ستقلل أيضًا من استقرار النظام. يمكن استخدام تجمعات الخيوط التخصيص والضبط والمراقبة. ومع ذلك ، للاستفادة العقلانية من تجمعات الخيوط ، يجب أن تعرف مبادئها جيدًا.
2. استخدام تجمع الخيوط
الأنواع الأربعة من المواضيع التي يوفرها المنفذون 1. newcachedthreadpool تنشئ مجموعة خيوط قابلة للتخزين مؤقت. إذا تجاوز طول تجمع الخيط احتياجات المعالجة ، فيمكنه إعادة تدوير مؤشرات الترابط الخاملة بمرونة. إذا لم يكن هناك إعادة تدوير ، قم بإنشاء موضوع جديد. 2.NewFixedThreadPool ينشئ تجمع مؤشر ترابط ثابت طول يمكنه التحكم في الحد الأقصى لعدد مؤشرات الترابط ، وسوف تنتظر الخيوط الزائدة في قائمة الانتظار. 3. NewScheduledThreadPool ينشئ تجمع مؤشر ترابط ثابت طوله يدعم تنفيذ المهمة الموقوت والدوري. 4.NewSingleThreadExecutor ينشئ مجموعة مؤشرات ترابط واحدة ، والتي ستستخدم فقط مؤشر ترابط عامل فريد لتنفيذ المهام ، مما يضمن تنفيذ جميع المهام بالترتيب المحدد (FIFO ، LIFO ، الأولوية).
1. NewCachedThreadPool ينشئ تجمع الخيوط القابلة للتخزين المؤقت. إذا تجاوز طول تجمع الخيط احتياجات المعالجة ، فيمكنه إعادة تدوير مؤشرات الترابط الخاملة بمرونة. إذا لم يكن هناك إعادة تدوير ، قم بإنشاء موضوع جديد. المثال كما يلي
ExecutorService ExecutorService = Executors.NewCacheDthReadPool () ؛ لـ (int i = 0 ؛ i <5 ؛ i ++) {final int index = i ؛ حاول {thread.sleep (index * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } executorservice.execute (new RunNable () {Override public void run () {system.out.println (thread.currentTherAd (). getName () + "،" + index) ؛}}) ؛} pool-1-thread-1،0POOL-1-THREAD-1،1POOL-1-THREAD-1،2POOL-1-THREAD-1،3POOL-1-THREAD-1،42.NewFixedThreadPool ينشئ تجمع مؤشر ترابط ثابت طول يمكنه التحكم في الحد الأقصى لعدد مؤشرات الترابط ، وسوف تنتظر الخيوط الزائدة في قائمة الانتظار. المثال كما يلي
ExecutorService fixedthreadpool = evelopors.newFixedThreadPool (4) ؛ for (int i = 0 ؛ i <5 ؛ i ++) {final int index = i ؛ flexThreadPool.execute (new RunNable () {Override public void run () {try {system.out.println (thread.currentThread (). GetName () + "،" + index) ؛ pool-1-thread-1،0POOL-1-THREAD-2،1POOL-1-THREAD-3،2POOL-1-THREAD-4،3POOL-1-THREAD-1،43. newscheduledThreadPool قم بإنشاء تجمع خيوط ثابت طوله ، وأمثلة من دورات الدعم ومهام التوقيت هي كما يلي
ScrimeDexecutorService ScredultHreadPool = Executors.NewScheduledThreadPool (5) ؛ system.out.println ("قبل:" + system.currentTimeMillis ()/1000) ؛ ScreduleThReadPool.Schedule (New RunNable () {Override public void run () {system.out.println ("التنفيذ المتأخر لمدة 3 ثوان:" + system.currentTimeMillis ()/1000) ؛} ، 3 ، timunit.seconds) ؛ system.outln ("بعد:" +System.CurrentTimeMillis ()/1000) ؛ // معلومات وحدة التحكم قبل: 1518012703.After: 1518012703 تأخرت لمدة 3 ثوان: 1518012706System.out.println ("قبل:" {Override public void run () {system.out.println ("بعد تأخير ثانية واحدة ، تنفذ مرة واحدة في 3 ثوانٍ:" +system.currentTimeMillis ()/1000) ؛رسالة وحدة التحكم
قبل: 1518013024
بعد: 1518013024
بعد تأخير ثانية واحدة ، قم بتنفيذ مرة واحدة في 3 ثوان: 1518013025
بعد تأخير ثانية واحدة ، قم بتنفيذ مرة واحدة في 3 ثوان: 1518013028
بعد تأخير ثانية واحدة ، قم بتنفيذ مرة واحدة في 3 ثوان: 1518013031
4.NewSingleThreadExecutor ينشئ مجموعة مؤشرات ترابط واحدة ، والتي تستخدم فقط مؤشرات ترابط العمال لتنفيذ المهام ، وضمان الطلب. المثال كما يلي
ExecutorService SingleThreAdexecutor = evelysors.newsinglethreadexecutor () ؛ for (int i = 0 ؛ i <10 ؛ i ++) {Final int index = i ؛ SingleThreAdexecutor.execute (new RunNable () {Override public void Run () {try {system.out.println (thread.currentThread ().معلومات وحدة التحكم
pool-1-thread-1،0
pool-1-thread-1،1
pool-1-thread-1،2
pool-1-thread-1،3
pool-1-thread-1،4
إرسال المهام إلى تجمع الخيوط. الفرق بين Execute () و Service () في فئة ThreadPoolexecutor هو في الواقع طريقة معلنة في المنفذ. يتم تنفيذه في ThreadPoolexecutor. هذه الطريقة هي الطريقة الأساسية لـ ThreadPoolexecutor. من خلال هذه الطريقة ، يمكن إرسال المهمة إلى تجمع مؤشرات الترابط وتسليمها إلى مجموعة مؤشرات الترابط للتنفيذ.
طريقة إرسال () هي طريقة معلنة في خدمة ExecutorService. تم تنفيذه في الملخص ExcrentExecutorService. لا يتم إعادة كتابتها في threadpoolexecutor. تستخدم هذه الطريقة أيضًا لتقديم المهام إلى تجمع الخيوط. ومع ذلك ، فإنه يختلف عن طريقة التنفيذ (). يمكنه إرجاع نتيجة تنفيذ المهمة. تحقق من تنفيذ طريقة إرسال () من خلال الكود المصدر ، وسوف تجد أنه في الواقع الطريقة التي تم تنفيذه () تسمى ، ولكنها تستخدم المستقبل للحصول على نتيجة تنفيذ المهمة.
/** * throws refectedExecutionException {inheritdoc} * throws nullpointerexception {inheritdoc} */المستقبل العام <؟> إرسال (مهمة Runnable) {if (task == null) رمي nullpointerxception () ؛ RunNableFuture <Void> ftask = newTaskfor (Task ، Null) ؛ تنفيذ (ftask) ؛ إرجاع ftask ؛}إغلاق تجمع الخيوط ، يمكننا إغلاق تجمع الخيوط عن طريق استدعاء طريقة إيقاف التشغيل أو إيقاف التشغيل في مجموعة مؤشرات الترابط ، ولكن مبادئ التنفيذ الخاصة بها مختلفة. يتمثل مبدأ الإغلاق في تعيين حالة مجموعة الخيوط ببساطة على حالة إيقاف التشغيل ، ثم مقاطعة جميع مؤشرات الترابط التي لا تنفذ المهام. يتمثل مبدأ إيقاف التشغيل في اجتياز مؤشرات ترابط العمال في تجمع الخيوط ، ثم استدعاء طريقة المقاطعة للمعلومات الواحدة تلو الأخرى لمقاطعة الخيط ، لذلك قد لا يتم إنهاء المهام التي لا يمكن الاستجابة للمقاطعات. ستقوم ShutdownNow أولاً بتعيين حالة تجمع الخيوط على التوقف ، ثم حاول إيقاف جميع مؤشرات الترابط التي تنفذ المهام أو توقفها ، والعودة إلى قائمة انتظار المهام.
طالما تسمى واحدة من هاتين الطريقتين الختاميتين ، ستعود طريقة iSshutdown بشكل صحيح. عندما يتم إغلاق جميع المهام ، فهذا يعني أن تجمع الخيوط مغلق بنجاح. سيعود استدعاء طريقة iSterminaed بشكل صحيح. فيما يتعلق بالطريقة التي يجب أن ندعوها لإغلاق تجمع مؤشرات الترابط ، يجب تحديدها من خلال خصائص المهمة المقدمة إلى مجموعة مؤشرات الترابط. عادة ، يتم استدعاء الإغلاق لإغلاق تجمع الخيوط. إذا لم يكن من الضروري تنفيذ المهمة ، فيمكن استدعاء إيقاف التشغيل.
3. تحليل تجمع الخيوط
تحليل العملية: يظهر سير العمل الرئيسي لمجموعة مؤشرات الترابط في الشكل أدناه: سير العمل الرئيسي لمجموعة خيوط Java
من الشكل أعلاه ، يمكننا أن نرى أنه عند تقديم مهمة جديدة إلى تجمع الخيوط ، يكون تدفق معالجة تجمع الخيوط كما يلي:
** تحليل رمز المصدر. ** يتيح لنا تحليل العملية أعلاه فهم مبدأ العمل بشكل حدسي لمجمعات الخيوط. دعنا نستخدم الرمز المصدر لنرى كيف يتم تنفيذه. يقوم تجمع الخيوط بتنفيذ المهام على النحو التالي:
void public execute (command runnable) {if (command == null) رمي nullpointerxception () جديد ؛ int c = ctl.get () ؛ if (workercountof (c) <corepoolsize) {if (addworker (command ، true)) return ؛ c = ctl.get () ؛ } if (iSrunning (c) && workqueue.offer (command)) {int reckeck = ctl.get () ؛ if (! isrunning (إعادة التحقق) && إزالة (أمر)) رفض (الأمر) ؛ وإلا } آخر إذا (! addworker (الأمر ، خطأ)) رفض (أمر) ؛} موضوع العمال. عندما ينشئ تجمع مؤشرات الترابط مؤشر ترابط ، فإنه سيغلف مؤشر الترابط في مؤشر ترابط عامل. بعد تنفيذ العامل المهمة ، ستحلق أيضًا بلا حدود للحصول على مهام في قائمة انتظار العمل للتنفيذ.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.