א 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
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
שקול את האיור הבא, המייצג את חמשת ה-CFs:
נניח שחמישה CFs בביצוע ו-CF21 מעלה חריגה אז כל ה-CF התלויים (CF31 ו-CF41) שגויים. זה אומר ש:
- הקריאה לשיטה isCompletedExceptionally() מחזירה true.
- הקריאה ל-get() זורקת ExecutionException שגורם לשורש Exception.
שקול את האיור הבא, שבו יצרנו את CF30 עם חריג.
כאשר CF21 פועל כרגיל, אז CF30 פשוט משדר את הערך. אם הוא מעלה חריג, CF30 מטפל בו ויוצר ערך עבור CF31.
ישנן שלוש שיטות לטיפול בחריג:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);