كيفية تنفيذ الواجهة القابلة للاستدعاء في Java

ستزودك هذه المقالة بمعرفة مفصلة وشاملة عن كيفية تنفيذ واجهة Callable في Java مع أمثلة.

تشهد برامج Java multithreading استخدام واسع النطاق قابل للاستدعاء والمستقبل. في ظل المعرفة المطلوبة مسبقًا للخيوط والترابط المتعدد ، سيكون القراء أكثر قدرة على استيعاب المناقشة في هذه المقالة. كما سأشرح الواجهة القابلة للاستدعاء في Java في هذه المقالة.

خلاصة المواضيع

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





ما هي الواجهة القابلة للاستدعاء في Java

بالنسبة إلى Java 5 ، تم تقديم الفئة 'java.util.concurrent'. تم إحضار هذه الواجهة القابلة للاستدعاء عبر حزمة التزامن التي تشبه واجهة Runnable. يمكنه أيضًا إرجاع أي كائن وقادر على طرح استثناء. تستخدم واجهة Java Callable Generics ، مما يجعل من الممكن إرجاع أي نوع من الكائنات. يوفر Executor Framework طريقة إرسال () لتنفيذ عمليات التنفيذ القابلة للاستدعاء في مجموعة من مؤشرات الترابط. في الواقع ، يلتزم Java Executor Framework بأنماط WorkerThread.

java-interfaceفي تجمع مؤشرات الترابط يمكن للمستخدمين بدء مؤشرات الترابط باستخدام طريقة Executors.newFixedThreadPool (10) وبالتالي إرسال مهمة إليه. يعمل التشغيل كهدف لمؤشر ترابط ويتم تنفيذ طريقة تشغيل الفراغ العام () بشكل إلزامي لتحديد المهمة. سيتم تنفيذ ذلك بواسطة مؤشرات الترابط في تجمع مؤشرات الترابط. استنادًا إلى توفر مؤشرات الترابط في التجمع ، يقوم Executor Framework بتعيين العمل (هدف قابل للتشغيل) إلى مؤشرات الترابط.إذا كانت جميع سلاسل الرسائل قيد الاستخدام ، فيجب إيقاف المهمة. بعد أن يكمل مؤشر الترابط مهمة واحدة ، فإنه يعود إلى التجمع باعتباره مؤشر ترابط متاح ، وهو جاهز لقبول المهام المستقبلية. يشبه Callable Runnable ويمكنه إرجاع أي نوع من الكائنات عندما نريد الحصول على نتيجة أو حالة من المهمة.



عودة الواجهة القابلة للاستدعاء

تقوم Java Callable بإرجاع java.util.concurrent. يقدم Java Future طريقة إلغاء () لإزالة المهمة القابلة للاستدعاء المرتبطة بها. هذه نسخة محملة بشكل زائد من طريقة get () ، حيث يمكن للمرء تحديد وقت معين لانتظار النتيجة. من المفيد تجنب الخيط الحالي ، والذي قد يتم حظره لفترة أطول. يرجى تذكر أن طريقة get هي طريقة متزامنة وإلى أن ينتهي الملف القابل للاستدعاء من مهمته ويعيد قيمة ، سيتعين عليه انتظار استدعاء.

هناك أيضًا أساليب 'isDone ()' و 'isCancelled ()' لجلب الحالة الحالية لمهمة قابلة للاستدعاء مرتبطة. ضع في اعتبارك المثال حيث يجب إيجاد مجموع كل الأعداد من واحد إلى 100. يمكننا تكرار الحلقات من 1 إلى 100 بالتتابع وإضافتها في النهاية. الاحتمال الآخر هو التقسيم والقهر. في هذه الطريقة ، يمكننا تجميع الأرقام بطريقة بحيث تحتوي كل مجموعة على عنصرين بالضبط. أخيرًا ، يمكننا تخصيص هذه المجموعة لمجموعة من المواضيع. لذلك ، يقوم كل مؤشر ترابط بإرجاع مجموع جزئي على التوازي ثم يجمع هذه المبالغ الجزئية ويجمعها للحصول على المجموع بالكامل.

دمج مجموعة فرز c ++



ميزات فئة Callable and Future

  • الفئة القابلة للاستدعاء هي واجهة من نوع SAM وبالتالي يمكن تنفيذها في تعبير lambda.

  • تحتوي الفئة القابلة للاستدعاء على طريقة واحدة فقط 'call ()' تحتوي على جميع التعليمات البرمجية اللازمة للتنفيذ بشكل غير متزامن.

  • في بيئة واجهة قابلة للتشغيل ، لم تكن هناك إمكانية لإرجاع نتيجة الحساب أو طرح استثناء محدد. في حين أنه مع Callable إرجاع قيمة وإلقاء استثناء محدد متاح.

  • يمكن استخدام طريقة Get () من فئة Future لاسترداد النتائج بمجرد الانتهاء من الحساب. يمكن للمستخدمين أيضًا التحقق مما إذا كان الحساب قد انتهى أم لا باستخدام طريقة ().

  • يعد إلغاء الحساب باستخدام طريقة future.cancel () نعمة أيضًا في بعض التطبيقات.

  • يُطلق على Get () استدعاء حظر ويستمر في الحظر حتى اكتمال الحساب.

    ما هو علم البيانات؟

مقارنة بين الفئات القابلة للاستدعاء والتشغيل

قابل للاستدعاء قابل للتشغيل
إنه جزء من ' java.util.concurrent ' الحزمة منذ Java 1.5إنه جزء من حزمة java.lang منذ Java 1.0
واجهة ذات معلمات ، مثل Callableواجهة غير معلمة
قادر على طرح استثناء محددلا يمكن طرح استثناء محدد
يحتوي على طريقة واحدة ، call () ، والتي تقوم بإرجاع النوع V ، وهذا هو نفس معلمة الواجهة المحددة 'النوع'هنا ، تحتوي على طريقة واحدة ، تسمى run () ، تُعيد الفراغ

يوجد أدناه مثال بسيط لفئة Java القابلة للاستدعاء التي تم تنفيذها حيث تقوم الكود بإرجاع اسم مؤشر الترابط المحدد ، والذي يقوم بتنفيذ المهمة بعد ثانية واحدة. هنا نستخدم إطار عمل المستخرج لتنفيذ 100 مهمة بالتوازي مع Java Future نتيجة المهام المرسلة. المقتطف الأول هو الإخراج ويمثل الرمز أدناه.

package com.journaldev.threads import java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException استيراد java.util.concurrent.ExecutorService import java .util.concurrent.Executors استيراد java.util.concurrent.Future public class MyCallable تنفذ Callable {Override public String call () يطرح Exception {Thread.sleep (1000) // إرجاع اسم الخيط تنفيذ هذه المهمة القابلة للاستدعاء إرجاع Thread.currentThread () .getName ()} public static void main (String args []) {// Get ExecutorService من فئة الأداة المساعدة Executors ، حجم تجمع مؤشر الترابط هو 10 ExecutorService worker = Executors.newFixedThreadPool (10) // إنشاء قائمة تحتوي على المستقبل كائن مرتبط بقائمة الاستدعاءlist = ArrayList جديدة() // إنشاء مثيل MyCallable Callable = new MyCallable () لـ (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

إيقاف تشغيل خدمات المنفذ

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

من أجل إخبار خدمة المنفذ بعدم وجود حاجة لتشغيل الخيوط ، يجب علينا إيقاف تشغيل الخدمة.

توجد ثلاث طرق لاستدعاء إيقاف التشغيل:

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

بهذا ، نصل إلى نهاية مقالة Callable Interface في مقالة Java. آمل أن تكون قد حصلت على فهم للواجهة المستقبلية والقابلة للاستدعاء في Java.

تفحص ال من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java.

لديك سؤال لنا؟ يرجى ذكرها في قسم التعليقات في مدونة 'الواجهة القابلة للاستدعاء في Java' وسنعاود الاتصال بك في أقرب وقت ممكن.