logo

מה זה CompletableFuture?

א CompltableFuture משמש לתכנות אסינכרוני. תכנות אסינכרוני פירושו כתיבת קוד לא חוסם. הוא מריץ משימה בשרשור נפרד מהשרשור הראשי של היישום ומודיע לשרשור הראשי על ההתקדמות, השלמתה או הכישלון שלה.

באופן זה, השרשור הראשי אינו חוסם או ממתין להשלמת המשימה. משימות אחרות מבוצעות במקביל. מקביליות משפרת את ביצועי התוכנית.

CompletableFuture הוא מחלקה ב-Java. זה שייך לחבילת java.util.cocurrent. הוא מיישם ממשק CompletionStage ו-Future.

שלב השלמה

  • הוא מבצע פעולה ומחזיר ערך כאשר שלב השלמה נוסף מסתיים.
  • מודל למשימה שעלולה להפעיל משימות אחרות.

לפיכך, זהו מרכיב של שרשרת.

כאשר יותר משרשור אחד מנסה להשלים - להשלים באופן חריג או לבטל CompletableFuture, רק אחד מהם מצליח.

25 מתוך 100

עתיד לעומת CompletableFuture

CompletableFuture הוא הרחבה ל-Future API של Java שהוצג ב-Java 8.

עתיד משמש לתכנות אסינכרוני. הוא מספק שתי שיטות, isDone() ו-get(). השיטות מאחזרות את תוצאת החישוב כשהוא מסתיים.

מגבלות העתיד

  • עתיד לא יכול להיות שלם הדדי.
  • לא נוכל לבצע פעולה נוספת בתוצאה של עתיד ללא חסימה.
  • לעתיד אין שום טיפול חריג.
  • איננו יכולים לשלב מספר עתידים.

לעתיד יש כל כך הרבה מגבלות, ולכן יש לנו CompletableFuture. CompletableFuture מספקת קבוצה רחבה של שיטות ליצירת עתידים מרובים, שרשור ושילוב. יש לו גם תמיכה מקיפה בטיפול בחריגים.

יצירת עתיד להשלים

אנו יכולים ליצור CompletableFuture רק באמצעות הבנאי הבא ללא ויכוחים.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

דוגמא

השיטות הנפוצות ביותר של CompletableFuture הן:

np std
    supplyAsync():הוא משלים את עבודתו באופן אסינכרוני. התוצאה של ספק מופעלת על ידי משימה מ-ForkJoinPool.commonPool() כברירת מחדל. שיטת supplyAsync() מחזירה CompletableFuture שעליה נוכל ליישם שיטות אחרות.thenApply():השיטה מקבלת פונקציה כארגומנטים. הוא מחזיר 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; } } 

תְפוּקָה:

CompletableFuture ב-Java

טיפול חריג של CompletableFuture

שקול את האיור הבא, המייצג את חמשת ה-CFs:

CompletableFuture ב-Java

נניח שחמישה CFs בביצוע ו-CF21 מעלה חריגה אז כל ה-CF התלויים (CF31 ו-CF41) שגויים. זה אומר ש:

  • הקריאה לשיטה isCompletedExceptionally() מחזירה true.
  • הקריאה ל-get() זורקת ExecutionException שגורם לשורש Exception.

שקול את האיור הבא, שבו יצרנו את CF30 עם חריג.

CompletableFuture ב-Java

כאשר CF21 פועל כרגיל, אז CF30 פשוט משדר את הערך. אם הוא מעלה חריג, CF30 מטפל בו ויוצר ערך עבור CF31.

ישנן שלוש שיטות לטיפול בחריג:

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