ما هي ExecutorService في Java وكيفية إنشائها؟



تتناول هذه المقالة مفهوم ExecutorService للواجهة الفرعية في Java مع أمثلة مختلفة لشرح إنشاء مؤشرات الترابط وإدارتها في Java.

تعمل لغة برمجة Java بكفاءة عالية مع ملفات التطبيقات التي تتطلب تنفيذ المهام بشكل متزامن في سلسلة رسائل. يصبح من الصعب على أي تطبيق تنفيذ عدد كبير من مؤشرات الترابط في وقت واحد. لذلك للتغلب على هذه المشكلة ، يأتي مع ExecutorService وهي واجهة فرعية لـ . في هذه المقالة ، سنناقش وظيفة ExecutorService في Java. فيما يلي المواضيع التي تم تناولها في هذه المدونة:

ما هو إطار المنفذ؟

من الأسهل إلى حد ما إنشاء وتنفيذ واحد أو اثنين من مؤشرات الترابط في وقت واحد. لكن يصبح الأمر صعبًا عندما يزداد عدد الخيوط إلى عدد كبير. سوف تحتوي التطبيقات الكبيرة متعددة الخيوط على مئات الخيوط التي تعمل في وقت واحد. لذلك من المنطقي تمامًا فصل إنشاء سلسلة الرسائل عن إدارة سلاسل الرسائل في أحد التطبيقات.





المنفذ هو يساعدك في إنشاء وإدارة المواضيع في التطبيق. ال يساعدك في المهام التالية.

  • إنشاء الخيط: يوفر مجموعة متنوعة من الأساليب لإنشاء سلاسل الرسائل التي تساعد في تشغيل تطبيقاتك في نفس الوقت.



  • إدارة الخيط: كما أنها تدير دورة حياة الخيط. لا داعي للقلق إذا كان الموضوع نشطًا أو مشغولاً أو ميتًا قبل إرسال المهمة للتنفيذ.

  • تقديم المهام وتنفيذها: يوفر إطار عمل المنفذ طرقًا لتقديم المهام في تجمع مؤشرات الترابط ، كما أنه يمنح القدرة على تحديد ما إذا كان سيتم تنفيذ مؤشر الترابط أم لا.

المنفذين خدمة المنفذين في java -edureka

ExecutorService في Java مثال

إنها واجهة فرعية لإطار عمل المنفذ تضيف وظائف معينة لإدارة دورة حياة مؤشر الترابط للتطبيق. يوفر أيضًا طريقة إرسال () يمكنها قبول كل من التشغيل القابل للتشغيل والاستدعاء شاء.



في المثال التالي ، سننشئ ExecutorService بخيط واحد ثم نرسل المهمة ليتم تنفيذها داخل الخيط.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors public class مثال {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName () )) System.out.println ('إنشاء ExecutorService') ExecutorService المنفذون = Executors.newSingleThreadExecutor () System.out.println ('إنشاء ملف قابل للتشغيل') قابل للتشغيل = () -> {System.out.println ('داخل: '+ Thread.currentThread (). getName ())} System.out.println (' إرسال المهمة المحددة من قبل التشغيل إلى خدمة المنفذة ') المنفذ (runnable)}}
 انتاج: من الداخل: إنشاء ExecutorService الرئيسي لإنشاء ملف قابل للتشغيل ، أرسل المهمة المحددة بواسطة التشغيل إلى خدمة المنفذين بالداخل: pool-1-thread-1

ما سبق يوضح كيف يمكننا إنشاء ExecutorService وتنفيذ مهمة داخل المنفذ. إذا تم إرسال مهمة للتنفيذ وكان مؤشر الترابط مشغولًا حاليًا بتنفيذ مهمة أخرى ، فستنتظر المهمة في قائمة انتظار حتى يصبح الخيط حراً لتنفيذه.

عند تشغيل البرنامج أعلاه ، لن يتم إنهاء البرنامج أبدًا. ستحتاج إلى إغلاقها صراحةً لأن خدمة المنفذ تستمر في الاستماع إلى المهام الجديدة.

تطبيقات Java ExecutorService

ExecutorService تشبه إلى حد كبير تجمع مؤشرات الترابط. في الواقع ، فإن تنفيذ ExecutorService في java.util.concurrent صفقة هو تنفيذ threadpool. تحتوي ExecutorService على التطبيقات التالية في الحزمة java.util.concurrent:

ThreadPoolExecutor

ينفذ ThreadPoolExecutor المهام المحددة باستخدام أحد مؤشرات الترابط المجمعة داخليًا.

إنشاء threadPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor (corePoolSize، maxPoolSize، keepAliveTime، TimeUnit.MILLISECONDS، new LinkedBlockingQueue ())

مجدولتثريدبوليكوتور

java.util.concurrent.ScheduledThreadPoolExecutor هي خدمة ExecutorService يمكنها جدولة المهام للتشغيل بعد تأخير أو تنفيذها بشكل متكرر بفاصل زمني ثابت بين كل تنفيذ.

مثال

ScheduledExecutorService Scheduledexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFutureجدولتَفوتشر = جدولة ExecutorService.schedule (new Callable () {public Object call () يطرح الاستثناء {System.out.println ('المنفّذ') 'يُسمى'}} ، 5 ، TimeUnit. ثوان)

استخدام ExecutorService

هناك عدة طرق مختلفة لتفويض المهام إلى ExecutorService.

  • تنفيذ (قابل للتشغيل)

  • إرسال (قابل للتشغيل)

  • استدعاء أي ()

  • استدعاء الكل ()

تنفيذ Runnable

تنفيذ Java ExecutorService (Runnable) يأخذ كائن java.lang.Runnable ويقوم بتنفيذه بشكل غير متزامن.

ExecutorService executorService = Executors.newSingleThreadExecutor () developerorService.execute (جديد Runnable () {public void run () {System.out.println ('مهمة غير متزامنة')}}) executorService.shutdown ()

لا توجد طريقة للحصول على نتيجة التنفيذ Runnable ، لذلك عليك استخدام Callable.

إرسال Runnable

تأخذ طريقة تقديم Java ExecutorService (Runnable) تطبيق Runnable وتقوم بإرجاع كائن مستقبلي. يمكن استخدام الكائن المستقبلي للتحقق مما إذا كان Runnable قد انتهى من التنفيذ.

المستقبل المستقبلي = exitorService.submit (جديد Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // ترجع فارغة إذا تم الانتهاء من المهمة بشكل صحيح.

إرسال قابل للاستدعاء

تشبه طريقة تقديم Java ExecutorService (Callable) طريقة الإرسال (Runnable) ولكنها تأخذ Java Callable بدلاً من Runnable.

Future Future = ExynorService.submit (new Callable () {public Object call () تلقي استثناء {System.out.println ('Asynchronous callable') إرجاع 'Callable Result'}}) System.out.println ('future.get () ) = 'Future.get ())
 انتاج: غير قابل للاستدعاء Future.get = نتيجة قابلة للاستدعاء

استدعاء أي ()

تأخذ طريقة invokeAny () مجموعة من الكائنات القابلة للاستدعاء. لا يؤدي استدعاء هذه الطريقة إلى إرجاع أي مستقبل ، ولكنه يُرجع نتيجة أحد الكائنات القابلة للاستدعاء.

ExecutorService ExecutorService = مجموعة Executors.newSingleThreadExecutor ()callables = HashSet جديد() callables.add (new Callable () {public String call () يلقي استثناء {return'task A '}}) callables.add (new Callable () {public String call () throws Exception {return'task B'} }) callables.add (new Callable () {public String call () يطرح الاستثناء {return'task C '}}) نتيجة السلسلة = المنفّذ الخدمة. .اغلق()

عندما تقوم بتشغيل الكود أعلاه ، تتغير النتيجة. قد تكون المهمة 'أ' والمهمة 'ب' وما إلى ذلك.

InvokeAll ()

تستدعي طريقة invokeAll () كافة الكائنات القابلة للاستدعاء التي تم تمريرها كمعلمات. يقوم بإرجاع الكائنات المستقبلية التي يمكن استخدامها للحصول على نتائج تنفيذ كل Callable.

ExecutorService ExecutorService = مجموعة Executors.newSingleThreadExecutor ()callables = HashSet جديد() callables.add (new Callable () {public String call () يلقي استثناء {return 'Task A'}}) callables.add (new Callable () {public String call () throws Exception {return 'Task B'} }) callables.add (new Callable () {public String call () يطرح استثناء {return 'Task C'}}) قائمةfutures = ExecutorService.invokeAll (callables) لـ (Future Future: futures) {System.out.println ('future.get =' + future.get ())} المنفذ التنفيذي Service.shutdown ()

Runnable مقابل Callable

إن واجهات التشغيل والقابلة للاستدعاء متشابهة جدًا مع بعضها البعض. الفرق واضح في إعلان واجهات. تمثل كلتا الواجهتين مهمة يمكن تنفيذها بشكل متزامن بواسطة مؤشر ترابط أو ExecutorService.

إعلان قابل للاستدعاء:

واجهة عامة قابلة للاستدعاء {public object call () throws Exception}

إعلان قابل للتشغيل:

الواجهة العامة Runnable {public void run ()}

الفرق الرئيسي بين الاثنين هو أن طريقة الاستدعاء () يمكنها إرجاع كائن من استدعاء الأسلوب. ويمكن لطريقة الاستدعاء () رمي ملف بينما لا يمكن للطريقة run ().

لديه مقابل هو جافا

إلغاء المهمة

يمكنك إلغاء المهمة المرسلة إلى ExecutorService ببساطة عن طريق استدعاء طريقة الإلغاء في المستقبل المقدم عند إرسال المهمة.

Future.cancel ()

ExecutorService Shutdown

من أجل منع سلاسل الرسائل من العمل حتى بعد اكتمال التنفيذ ، يجب عليك إيقاف تشغيل ExecutorService.

اغلق()

لإنهاء سلاسل العمليات داخل ExecutorService ، يمكنك استدعاء طريقة إيقاف التشغيل ().

منفذ الخدمة ()

يقودنا هذا إلى نهاية هذه المقالة حيث تعلمنا كيف يمكننا استخدام ExecutorService لتنفيذ المهام في سلسلة رسائل. آمل أن تكون واضحًا بشأن كل ما تمت مشاركته معك في هذا البرنامج التعليمي.

إذا وجدت هذه المقالة حول 'ExecutorService in Java' ذات صلة ، فراجع ملف شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرة في جميع أنحاء العالم.

نحن هنا لمساعدتك في كل خطوة في رحلتك والتوصل إلى منهج مصمم للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطور جافا. تم تصميم الدورة التدريبية لمنحك السبق في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد مثل بيات شتوى & .

إذا صادفت أي أسئلة ، فلا تتردد في طرح جميع أسئلتك في قسم التعليقات في 'ExecutorService in Java' وسيسعد فريقنا بالإجابة.