مقدمة
في سلسلة Boot Boot Basic السابقة السابقة ، تم تقديم مقالة "باستخدام ASYNC لتنفيذ المكالمات غير المتزامنة في Spring Boot" كيفية استخدام async التعليق لتنفيذ المكالمات غير المتزامنة. ومع ذلك ، فإن السيطرة على عمليات الإعدام غير المتزامنة هذه هي مهارتنا الأساسية في ضمان صحة تطبيقاتنا. في هذه المقالة ، دعنا نتعلم ما إذا كنا نتحكم في تزامن المكالمات غير المتزامنة من خلال تجمعات الخيوط المخصصة.
يمكننا تعديل الأمثلة في هذه المقالة استنادًا إلى الأمثلة السابقة ، أو إنشاء مشروع جديد لتجهيز الربيع.
تحديد البركة الخيط
الخطوة الأولى هي تحديد تجمع الخيوط في فئة SPRING BOOT الرئيسية ، مثل:
springbootapplicationpublicpublic application {public static void main (string [] args) {springapplication.run (application.class ، args) ؛ } enableAsync @class taskPoolConfig {bean ("taskexecutor") المنفذ العام taskexecutor () {threadpooltaskexecutor executor = new threadpooltaskexecutor () ؛ Executor.SetCorePoolSize (10) ؛ Executor.SetMaxPoolsize (20) ؛ Executor.SetQueUeCapacity (200) ؛ Executor.SetKeepaliveseconds (60) ؛ Executor.SetThReadNamePrefix ("taskexecutor-") ؛ Executor.SetRejectedExecutionHandler (New ThreadPoolExecutor.CallerRunspolicy ()) ؛ إرجاع المنفذ ؛ }}}أعلاه قمنا بإنشاء تجمع مؤشرات ترابط باستخدام ThreadPooltAskexecutor ، وضبط المعلمات التالية:
باستخدام تجمع الموضوع
بعد تحديد تجمع الخيوط ، كيف نجعل المهام غير المتزامنة تسمى تنفيذها باستخدام الموارد في مجموعة مؤشرات الترابط هذه؟ الطريقة بسيطة للغاية. نحتاج فقط إلى تحديد اسم تجمع مؤشرات الترابط في شرح async ، على سبيل المثال:
@slf4j@componentpublic class task {public static عشوائي عشوائي = جديد عشوائي () ؛ async ("taskexecutor") public void dotaskone () يلقي الاستثناء {log.info ("Start Task One") ؛ بدء طويل = system.currentTimeMillis () ؛ thread.sleep (random.nextint (10000)) ؛ End Long = System.CurrentTimeMillis () ؛ log.info ("المهمة الكاملة الأولى ، الوقت المستغرق:" + (end - start) + "milliseconds") ؛ } async ("taskexecutor") public void dotasktwo () يلقي الاستثناء {log.info ("start task 2") ؛ بدء طويل = system.currentTimeMillis () ؛ thread.sleep (random.nextint (10000)) ؛ End Long = System.CurrentTimeMillis () ؛ log.info ("المهمة الكاملة 2 ، الوقت المستغرق:" + (end - start) + "milliseconds") ؛ } async ("taskexecutor") public void dotaskthree () يلقي الاستثناء {log.info ("Start Task Three") ؛ بدء طويل = system.currentTimeMillis () ؛ thread.sleep (random.nextint (10000)) ؛ End Long = System.CurrentTimeMillis () ؛ log.info ("المهمة الكاملة الثالثة ، تستهلك الوقت:" + (end - start) + "milliseconds") ؛ }}اختبار الوحدة
أخيرًا ، دعنا نكتب اختبار وحدة للتحقق منه
Runwith (SpringJunit4ClassRunner.Class) springBootTestpublic Class ApplicationTests {autowired private Task Task ؛ Test public void test () يلقي الاستثناء {task.dotaskone () ؛ Task.dotasktwo () ؛ Task.DotaskThree () ؛ thread.currentThRead (). Join () ؛ }}قم بإجراء اختبار الوحدة أعلاه ، يمكننا أن نرى في وحدة التحكم أن جميع أسماء مؤشرات ترابط الإخراج مسبوقة بواسطة مجموعة مؤشرات الترابط التي حددناها من قبل ، مما يعني أن تجربتنا باستخدام مجموعة مؤشرات الترابط كانت ناجحة!
2018-03-27 22: 01: 15.620 info 73703 ---
2018-03-27 22: 01: 15.620 info 73703 ---
2018-03-27 22: 01: 15.620 info 73703 ---
2018-03-27 22: 01: 18.165 info 73703 ---
2018-03-27 22: 01: 22.149 info 73703 ---
2018-03-27 22: 01: 23.912 info 73703 ---
مثال كامل:
يمكن للقراء اختيار عرض مشروع الفصل 4-1-3 وفقًا لتفضيلاتهم:
Github: https://github.com/dyc87112/springboot-learning/
Gite: https://gitee.com/diidispace/springboot-learning/
تنزيل محلي: http://xiazai.vevb.com/201805/yuanma/springboot-learning(vevb.com).rar
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.