logo

ما هو المستقبل الكامل؟

أ CompltableFuture يستخدم للبرمجة غير المتزامنة. البرمجة غير المتزامنة تعني كتابة تعليمات برمجية غير محظورة. يقوم بتشغيل مهمة على مؤشر ترابط منفصل عن مؤشر ترابط التطبيق الرئيسي ويخطر الخيط الرئيسي بتقدمها أو اكتمالها أو فشلها.

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

CompletableFuture هي فئة في Java. إنه ينتمي إلى الحزمة java.util.cocurrent. وهي تنفذ واجهة CompletionStage والمستقبل.

مرحلة الإكمال

  • ينفذ إجراءً ويعيد قيمة عند اكتمال مرحلة إكمال أخرى.
  • نموذج لمهمة قد تؤدي إلى مهام أخرى.

ومن ثم فهو عنصر من عناصر السلسلة.

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

رمز الرقم العشوائي ج

المستقبل مقابل المستقبل الكامل

يعد CompletableFuture امتدادًا لواجهة برمجة التطبيقات المستقبلية لـ Java والتي تم تقديمها في Java 8.

يستخدم المستقبل للبرمجة غير المتزامنة. يوفر طريقتين، isDone() و get(). تقوم الطرق باسترداد نتيجة الحساب عند اكتماله.

حدود المستقبل

  • لا يمكن للمستقبل أن يكون مكتملاً بشكل متبادل.
  • لا يمكننا القيام بمزيد من الإجراءات بشأن نتيجة المستقبل دون الحجب.
  • المستقبل ليس لديه أي معالجة استثناء.
  • لا يمكننا الجمع بين العقود الآجلة المتعددة.

المستقبل له الكثير من القيود، ولهذا السبب لدينا CompletableFuture. يوفر CompletableFuture مجموعة واسعة من الأساليب لإنشاء عقود آجلة متعددة وتسلسلها ودمجها. كما أن لديها دعمًا شاملاً لمعالجة الاستثناءات.

خلق مستقبل كامل

يمكننا إنشاء CompletableFuture فقط باستخدام مُنشئ عدم الوسيطة التالي.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

مثال

طرق CompletableFuture الأكثر استخدامًا هي:

    SupplyAsync ():يكمل وظيفته بشكل غير متزامن. يتم تشغيل نتيجة المورد بواسطة مهمة من ForkJoinPool.commonPool() كإعداد افتراضي. تقوم طريقة SupplyAsync () بإرجاع CompletableFuture حيث يمكننا تطبيق طرق أخرى عليها.ثم تطبيق ():تقبل الطريقة الوظيفة كوسائط. تقوم بإرجاع CompletableStage جديد عندما تكتمل هذه المرحلة بشكل طبيعي. تستخدم المرحلة الجديدة كوسيطة للوظيفة المتوفرة.ينضم():تقوم الطريقة بإرجاع القيمة الناتجة عند اكتمالها. كما أنه يطرح CompletionException (استثناء لم يتم تحديده) إذا تم إكماله بشكل استثنائي.
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

انتاج:

المستقبل الكامل في جافا

معالجة الاستثناءات الخاصة بالمستقبل الكامل

خذ بعين الاعتبار الشكل التالي الذي يمثل المراكز الخمسة:

المستقبل الكامل في جافا

لنفترض أن خمسة CFs قيد التنفيذ وأن CF21 يثير استثناءً، فإن جميع CF المعتمدة (CF31 وCF41) خاطئة. هذا يعني انه:

أمريتا راو ممثلة
  • يؤدي استدعاء الأسلوب isCompletedExceptionally() إلى إرجاع صحيح.
  • يؤدي استدعاء get() إلى طرح ExecutionException الذي يسبب استثناء الجذر.

خذ بعين الاعتبار الشكل التالي، الذي أنشأنا فيه CF30 مع استثناء.

المستقبل الكامل في جافا

عندما يتم تنفيذ CF21 بشكل طبيعي، يقوم CF30 فقط بنقل القيمة. إذا ظهر استثناء، فإن CF30 يعالجه ويولد قيمة لـ CF31.

هناك ثلاث طرق للتعامل مع الاستثناء:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);