ב Java , עתיד הוא מִמְשָׁק ששייך ל java.util.concurrent חֲבִילָה . הוא משמש לייצוג התוצאה של חישוב אסינכרוני. הממשק מספק את השיטות לבדוק אם החישוב הושלם או לא, להמתין להשלמתו ולאחזר את תוצאת החישוב. לאחר השלמת המשימה או החישוב, לא ניתן לבטל את החישוב.
תחביר:
public interface Future
דוגמה ל-Java Future
הדוגמה הטובה ביותר של Java Future היא ExecutorService מִמְשָׁק. הוא מייצר אובייקט Future (מחלק מהשיטות שלהם) למעקב אחר התקדמות של משימה אסינכרונית אחת או יותר.
ממשק שיטות העתיד
הממשק מספק את חמש השיטות הבאות:
שיטה | תיאור |
---|---|
לְבַטֵל() | הוא מנסה לבטל את ביצוע המשימה. |
לקבל() | השיטה ממתינה במידת הצורך עד להשלמת החישוב, ולאחר מכן משחזרת את התוצאה שלה. |
לקבל() | ממתין במידת הצורך, לכל היותר לזמן הנתון להשלמת החישוב, ואז מאחזר את התוצאה שלו, אם זמינה. |
זה בוטל() | זה מחזיר נכון אם המשימה בוטלה לפני השלמתה. |
נעשה() | זה מחזיר נכון אם המשימה הושלמה. |
היה כמה חסרונות בממשק Future שהם כדלקמן:
- באמצעות Future, לא ניתן להשלים את החישוב באופן ידני.
- זה לא מודיע לאחר השלמת המעבר.
- לא ניתן ליצור ולשלב את השרשרת שלו.
על מנת להתגבר על המגבלות הנ'ל, Java 8 הוצג CompletableFuture .
שימוש עתיד בתכנות אסינכרוני
קבלת תוצאה
כפי שדיברנו לעיל, העתיד מייצג תוצאה של משימה אסינכרונית. על מנת לאחזר את התוצאה של אותה משימה אסינכרונית, ממשק Java Future מספק את שתי הגרסאות הבאות של מתודות get() שניהם מחזירות אובייקט. שימו לב שסוג ההחזרה עשוי להיות סוג גנרי. לדוגמה:
Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
הערה: אם ננסה להפעיל את שיטת get() לפני השלמת המשימה האסינכרונית, שיטת get() תיחסם עד שהתוצאה תהיה מוכנה.
על מנת להתגבר על החסרון הנ'ל, ממשק Future מספק גרסה נוספת של שיטת get() אשר פרט לכמות של זְמַן (במילישניות) כפרמטר. זה מייצג שהעתיד ימתין פרק זמן להשלמת המשימה לאחר שהתוצאה הזו תהיה זמינה בעתיד. לדוגמה:
try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. }
אם Future לא יקבל כל תוצאה בתוך הזמן שצוין, א חריג פסק זמן נזרק על ידי העתיד.
בטל משימה אסינכרונית
אנחנו יכולים גם לבטל משימה אסינכרונית בכל נקודה על ידי קריאה ל- לְבַטֵל() שיטת ממשק העתיד. לדוגמה:
Future future = ... // Get Future from somewhere future.cancel();
בדוק אם בוצעה משימה אסינכרונית
הממשק מספק שיטה נעשה() כדי לבדוק אם המשימה האסינכרונית הושלמה או לא. לדוגמה:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
בדוק אם משימה אסינכרונית מבוטלת
ממשק העתיד מספק שיטה זה בוטל() כדי לבדוק אם המשימה האסינכרונית המיוצגת על ידי Future בוטלה או לא. זה מחזיר true אם המשימה מבוטלת בהצלחה, אחרת מחזירה false. לדוגמה:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
דוגמה ל-Java Future
FutureExample.java
import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } }
תְפוּקָה: