שיפורי API 9 של Java 9 CompletableFuture

1. הקדמה

Java 9 מגיע עם כמה שינויים ב- העתיד מעמד. שינויים כאלה הוכנסו כחלק מ- JEP 266 במטרה לטפל בתלונות והצעות נפוצות מאז הצגתו ב- JDK 8, באופן ספציפי יותר, תמיכה בעיכובים ובפסקי זמן, תמיכה טובה יותר בסיווג משנה ובשיטות שימוש מעטות.

מבחינה קוד, ה- API מגיע עם שמונה שיטות חדשות וחמש שיטות סטטיות חדשות. כדי לאפשר תוספות כאלה, שונה 1500 מתוך 2400 שורות קוד (לפי Open JDK).

2. תוספות API Instance

כאמור, ה- API של מופע מגיע עם שמונה תוספות חדשות, והן:

  1. ברירת מחדל של המוציא לפועלExecutor ()
  2. CompletableFuture newIncompleteFuture ()
  3. העתק העתיד ()
  4. CompletionStage minimalCompletionStage ()
  5. השלמה העתיד הושלם Async (ספק הספק, מוציא להורג)
  6. השלמה העתיד הושלם Async (ספק הספק)
  7. CompleteFuture או Timeout (פסק זמן ארוך, יחידת TimeUnit)
  8. CompleteTuture completeOnTimeout (ערך T, פסק זמן ארוך, יחידת TimeUnit)

2.1. שיטה defaultExecutor ()

חֲתִימָה: ברירת מחדל של המוציא לפועלExecutor ()

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

חדש CompletableFuture (). defaultExecutor ()

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

2.2. שיטה newIncompleteFuture ()

חֲתִימָה: CompletableFuture newIncompleteFuture ()

ה newIncompleteFuture, המכונה גם "הבנאי הווירטואלי", משמש לקבלת מופע עתידי הניתן להשלמה מאותו סוג.

חדש CompletableFuture (). newIncompleteFuture ()

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

2.3. שיטה עותק()

חֲתִימָה: העתק העתיד ()

שיטה זו מחזירה חדשה העתיד איזה:

  • כאשר זה מסתיים כרגיל, החדש מסתיים גם כרגיל
  • כאשר זה יושלם באופן יוצא מן הכלל למעט X, החדש יושלם גם באופן יוצא דופן עם CompletionException עם X כגורם
חדש CompletableFuture (). העתק ()

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

2.4. שיטה minimalCompletionStage ()

חֲתִימָה: CompletionStage minimalCompletionStage ()

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

חדש CompletableFuture (). minimalCompletionStage ()

חדש העתיד עם כל השיטות הזמינות ניתן לאחזר באמצעות toCompletableFuture שיטה זמינה ב- שלב השלמה ממשק API.

2.5. שיטות completeAsync ()

ה completeAsync יש להשתמש בשיטה להשלמת ה- העתיד באופן אסינכרוני באמצעות הערך שניתן על ידי ספק בתנאי.

חתימות:

CompletableFuture completeAsync (ספק הספק, מבצע ההוצאה לפועל) CompleteetFuture completeAsync (ספק הספק)

ההבדל בין שתי השיטות העמוסות הללו הוא קיומו של הטיעון השני, שבו ה- מוציא להורג ניתן לציין את הפעלת המשימה. אם לא מסופק אף אחד, מנהל ברירת המחדל (מוחזר על ידי defaultExecutor שיטה) ישמש.

2.6. שיטות orTimeout ()

חֲתִימָה: CompleteFuture או Timeout (פסק זמן ארוך, יחידת TimeUnit)

חדש CompletableFuture (). orTimeout (1, TimeUnit.SECONDS)

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

2.7. שיטה completeOnTimeout ()

חֲתִימָה: CompleteTuture completeOnTimeout (ערך T, פסק זמן ארוך, יחידת TimeUnit)

חדש CompletableFuture (). completeOnTimeout (ערך, 1, TimeUnit.SECONDS)

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

3. תוספות API סטטיות

נוספו גם כמה שיטות שימוש. הם:

  1. מוציא לפועל (עיכוב ארוך, יחידת TimeUnit, מוציא לפועל)
  2. ביצוע עיכוב ביצוע (עיכוב ארוך, יחידת TimeUnit)
  3. השלמה שלב הושלם שלב (ערך U)
  4. CompletionStage failedStage (ניתן לזרוק לשעבר)
  5. CompleteFuture failedFuture (לשעבר לזריקה)

3.1. שיטות עיכוב ביצוע

חתימות:

אקסהייקר (עיכוב ארוך, יחידת TimeUnit, אקספקטור) Executor עיכוב (עיכוב ארוך, יחידת TimeUnit)

מחזיר חדש מוציא להורג שמגיש משימה למנהל הבסיס הנתון לאחר העיכוב הנתון (או ללא עיכוב אם אינו חיובי). כל עיכוב מתחיל עם הפעלת שיטת ההוצאה לפועל של המוציא לפועל. אם לא צוין אף מנהל ביצוע, ברירת המחדל (ForkJoinPool.commonPool ()) יהיה בשימוש.

3.2. שיטות completeStage ו נכשל שלב

חתימות:

 CompletionStage הסתיים Stage (ערך U) CompletionStage failedStage (ניתן לזריקה לשעבר)

החזרת שיטות השירות הזו כבר נפתרה שלב השלמה מקרים, או שהושלמו כרגיל עם ערך (completeStage) או הושלם באופן יוצא דופן (נכשל שלב) למעט החריג הנתון.

3.3. שיטה נכשל העתיד

חֲתִימָה: CompleteFuture failedFuture (לשעבר לזריקה)

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

4. דוגמאות למקרי שימוש

במסגרת סעיף זה, יוצגו כמה דוגמאות לשימוש בחלק מה- API החדש.

4.1. לְעַכֵּב

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

עתיד CompletableFuture = חדש CompletableFuture (); future.completeAsync (() -> קלט, CompletableFuture.delayedExecutor (1, TimeUnit.SECONDS));

4.2. השלם עם ערך בזמן הקצוב

דרך נוספת להשיג תוצאה מאוחרת היא להשתמש ב- completeOnTimeout שיטה. דוגמה זו מגדירה א העתיד שייפתר עם קלט נתון אם הוא לא ייפתר לאחר שנייה אחת.

עתיד CompletableFuture = חדש CompletableFuture (); future.completeOnTimeout (קלט, 1, TimeUnit.SECONDS);

4.3. פסק זמן

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

עתיד CompletableFuture = חדש CompletableFuture (); future.orTimeout (1, TimeUnit.SECONDS);

5. מסקנה

לסיכום, Java 9 מגיע עם מספר תוספות ל- העתיד API, עכשיו יש לו תמיכה טובה יותר לסיווג משנה, הודות ל- newIncompleteFuture בונה וירטואלי, ניתן להשתלט על ה שלב השלמה מקרים חזרו ברוב המקרים שלב השלמה ממשק API.

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

את הדוגמאות המשמשות במאמר זה ניתן למצוא במאגר GitHub שלנו.


$config[zx-auto] not found$config[zx-overlay] not found