ב-Java ריבוי שרשורים מאפשר הפעלת משימות במקביל ומשפר את הביצועים וההיענות. באופן מסורתי מפתחים השתמשו בממשק Runnable כדי להגדיר משימות אבל יש לו שתי מגבלות עיקריות: הוא לא יכול להחזיר תוצאה ולא יכול לזרוק חריגים מסומנים. כדי להתגבר על אלה הציגה Java את ממשקי Callable ו-Future ב-Java 5.
ממשק הניתן להתקשרות
ה ממשק הניתן להתקשרות מייצג משימה שמחזירה תוצאה ועלולה לגרום לחריגה. זה דומה ל- Runnable אבל גמיש יותר מכיוון שהוא יכול להחזיר ערך ולזרוק חריגים מסומנים.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
תְפוּקָה
Result: 15
הֶסבֵּר: משימה ניתנת להתקשרות מוגשת למבצע. הוא מחשב את סכום המספרים מ-1 עד 5 ומחזיר את התוצאה. התוצאה מאוחזרת באמצעות future.get() לאחר סיום המשימה.
ממשק עתידי
ה ממשק עתידי מייצג את התוצאה של חישוב אסינכרוני. כאשר אתה שולח משימה ניתנת להתקשרות או הרצה ל-ExecutorService, היא מחזירה אובייקט Future.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
תְפוּקָה
Result: 30
הֶסבֵּר: הCallableמחשבי משימה10 + 2 and ExecutorService.submit()שיטה מחזירה אFutureלְהִתְנַגֵד. באמצעותfuture.get()אנו מקבלים את התוצאה לאחר שהחישוב יסתיים.
ניתן להתקשר מול עתיד
| תכונה | ניתן להתקשרות | עָתִידִי |
|---|---|---|
| מַטָרָה | מייצג משימה שמחזירה תוצאה | מייצג את התוצאה של משימה אסינכרונית |
| סוג החזרה | מחזיר תוצאה בעת ביצוע | מחזיק את התוצאה שהוחזרה על ידי Callable |
| מוגדר ב | חבילת java.util.concurrent | חבילת java.util.concurrent |
| הוֹצָאָה לְפוֹעַל | הוגש ל-ExecutorService | הוחזר על ידי ExecutorService.submit() |
| שיטות | בעל שיטה אחת קריאה () | יש שיטות כמו get() isDone() cancel() |
| טיפול חריג | יכול לזרוק חריגים מסומנים | מטפל בתוצאות וחריגים לאחר ביצוע |
| נוֹהָג | מגדיר מה לבצע | שולט מנטר ומחזיר את התוצאה של משימה |