logo

خدمة تنفيذ جافا

Java ExecutorService هي الواجهة التي تسمح لنا بتنفيذ المهام على سلاسل الرسائل بشكل غير متزامن. واجهة Java ExecutorService موجودة في الحزمة java.util.concurrent. تساعد ExecutorService في الحفاظ على مجموعة من سلاسل الرسائل وتعيين المهام لها. كما أنه يوفر إمكانية ترتيب المهام في قائمة الانتظار حتى يتوفر مؤشر ترابط مجاني إذا كان عدد المهام أكثر من سلاسل الرسائل المتوفرة.

خدمة تنفيذ جافا

طرق Java ExecutorService

طريقة وصف
انتظار منطقي (مهلة طويلة، وحدة TimeUnit) تحظر هذه الطريقة مهمة الدخول إلى ExecutorService حتى تكتمل جميع المهام بعد طلب إيقاف التشغيل، أو تنتهي المهلة المحددة، أو تتم مقاطعة مؤشر الترابط الحالي، أيهما يحدث أولاً.
قائمةاستدعاء الكل(مجموعةمهام) تقوم هذه الطريقة بتنفيذ قائمة المهام المعطاة وإرجاع قائمة العقود الآجلة التي تحتوي على نتائج جميع المهام عند اكتمالها.
قائمةاستدعاء الكل(مجموعةالمهام، مهلة طويلة، وحدة TimeUnit) تقوم هذه الطريقة بتنفيذ قائمة المهام المعطاة وإرجاع قائمة العقود الآجلة التي تحتوي على نتائج جميع المهام عند اكتمالها أو انتهاء المهلة، أيهما يحدث أولاً.
T invocAny(Collectionمهام) تقوم هذه الطريقة بتنفيذ قائمة المهام المعطاة وإرجاع نتيجة مهمة واحدة يتم إكمالها دون طرح أي استثناء.
T invocAny(Collectionالمهام، مهلة طويلة، وحدة TimeUnit) تقوم هذه الطريقة بتنفيذ قائمة المهام المعطاة وإرجاع نتيجة مهمة واحدة يتم إكمالها دون طرح أي استثناء قبل انقضاء المهلة.
منطقي هوShutdown () تقوم هذه الطريقة بإرجاع ما إذا كان المنفذ المحدد قد تم إيقاف تشغيله أم لا.
تم إنهاء منطقية () ترجع هذه الطريقة صحيحًا إذا تم تنفيذ جميع المهام بعد إيقاف التشغيل.
اغلاق الفراغ () تسمح هذه الطريقة بإكمال المهام التي تم إرسالها مسبقًا إلى ExecutorService ولا تسمح بقبول أي مهام أخرى.
قائمة الاغلاقالآن () تقوم هذه الطريقة بإيقاف كافة المهام التي يتم تنفيذها بشكل نشط، وإيقاف تنفيذ المهام الموضوعة في قائمة الانتظار، وإرجاع قائمة المهام الموجودة في قائمة الانتظار.
الإرسال المستقبلي (مهمة قابلة للاستدعاء) ترسل هذه الطريقة مهمة إرجاع القيمة للتنفيذ وترجع المستقبل، الذي يمثل النتيجة المعلقة للمهمة.
الإرسال المستقبلي (مهمة قابلة للتشغيل) تقوم هذه الطريقة بإرسال مهمة للتنفيذ وإرجاع مستقبل يمثل تلك المهمة. تقوم بإرجاع فارغة عند الانتهاء بنجاح.
الإرسال المستقبلي (مهمة قابلة للتشغيل، نتيجة T) تقوم هذه الطريقة بإرسال مهمة للتنفيذ وإرجاع مستقبل يمثل تلك المهمة.

برنامج بسيط من Java ExecutorService

 public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } } 

انتاج:

خدمة تنفيذ جافا

في هذا البرنامج، نقوم بإنشاء ExecutorService بعشرة سلاسل رسائل ونخصص لها تطبيقًا مجهولًا قابلاً للتشغيل والذي يؤدي مهمة طباعة 'ExecutorService' وبعد انتهاء مهمته، نقوم بإيقاف تشغيل خدمة المنفذ.

كيفية استخدام جافا ExecutorService

إنشاء مثيل ExecutorService

يمكننا استخدام Java ExecutorService لإنشاء سلسلة رسائل واحدة، أو مجموعة من سلاسل الرسائل، أو مجموعة مجدولة من سلاسل الرسائل. توفر فئة Executors أساليب المصنع لإنشاء مثيل ExecutorService على النحو التالي-

 ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads. 

إسناد المهام إلى ExecutorServices

لتعيين مهمة إلى ExecutorService، يمكننا استخدام الطرق التالية-

  • تنفيذ (مهمة قابلة للتشغيل)
  • إرسال (مهمة قابلة للتشغيل) / إرسال (مهمة قابلة للاستدعاء)
  • استدعاء أي (مجموعةمهام)
  • استدعاء الكل(مجموعةمهام)

مثال على إسناد مهمة إلى ExecutorService باستخدام طريقة التنفيذ ().

تأخذ طريقة التنفيذ () الخاصة بـ Java ExecutorService كائنًا قابلاً للتشغيل وتنفذ مهمتها بشكل غير متزامن. بعد إجراء استدعاء طريقة التنفيذ، نستدعي طريقة إيقاف التشغيل، التي تمنع أي مهمة أخرى من وضعها في قائمة الانتظار في executorService.

 public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } } 

انتاج:

 ExecutorService 

مثال لتعيين مهمة إلى ExecutorService باستخدام إرسال ()

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

 public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } } 

مثال على إسناد مهمة إلى ExecutorService باستخدام طريقة invocatorAny()

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

 public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 1&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 2&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 3&apos;; } }); String result = executorService.invokeAny(callables); System.out.println(&apos;result = &apos; + result); executorService.shutdown(); } } </callable></callable>

انتاج:

 result = Task 1 

تقوم النتيجة بتخزين المهمة 1 حيث يتم تنفيذ أول كائن قابل للاستدعاء بنجاح أولاً.

مثال على إسناد مهمة إلى ExecutorService باستخدام طريقة invineAll()

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

 public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 1&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 2&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 3&apos;; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println(&apos;future.get = &apos; + future.get()); } executorService.shutdown(); } } </future></callable></callable>

انتاج:

 future.get = Task 1 future.get = Task 3 future.get = Task 2 

كيفية إيقاف تشغيل ExecutorService

بمجرد الانتهاء من المهام الموكلة إلى ExecutorService، يتعين علينا إيقاف تشغيلها لأن ExecutorService تؤدي المهمة على سلاسل رسائل مختلفة. إذا لم نقم بإيقاف تشغيل ExecutorService، فستستمر سلاسل العمليات في العمل، ولن يتم إيقاف تشغيل JVM.

يمكن أن تتم عملية الإغلاق بالطرق الثلاث التالية-

  • طريقة الاغلاق ().
  • طريقة إيقاف التشغيل الآن ().
  • طريقة انتظار الإنهاء ().