ניתן להריץ לעומת קריאה בג'אווה

1. סקירה כללית

מאז ימיה הראשונים של ג'אווה, ריבוי הליכי משנה היה היבט מרכזי בשפה. ניתן לרוץ הוא ממשק הליבה המסופק לייצוג משימות מרובות הליכי ו ניתן להתקשר היא גרסה משופרת של ניתן לרוץ שנוספה ב- Java 1.5.

במאמר זה נחקור את ההבדלים והיישומים של שני הממשקים.

2. מנגנון ביצוע

שני הממשקים נועדו לייצג משימה הניתנת לביצוע על ידי מספר אשכולות. ניתן לרוץ ניתן להפעיל את המשימות באמצעות פְּתִיל כיתה או שירות ExecutorService ואילו ניתנים להתקשרות ניתן להריץ רק באמצעות האחרון.

3. החזר ערכים

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

3.1. עם ניתן לרוץ

ה ניתן לרוץ ממשק הוא ממשק פונקציונלי ויש לו יחיד לָרוּץ() שיטה שאינה מקבלת פרמטרים ואינה מחזירה ערכים כלשהם.

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

ממשק ציבורי ניתן להריצה {run public public void (); }

בואו נבין זאת בדוגמה:

מחלקה ציבורית EventLoggingTask מיישמת Runnable {private Logger logger = LoggerFactory.getLogger (EventLoggingTask.class); @ ביטול הפעלה בטלנית ציבורית () {logger.info ("הודעה"); }}

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

חלל ציבורי executeTask () {executorService = Executors.newSingleThreadExecutor (); עתיד עתידי = executorService.submit (EventLoggingTask חדש ()); executorService.shutdown (); }

במקרה זה, עתיד אובייקט לא יחזיק שום ערך.

3.2. עם ניתן להתקשר

ה ניתן להתקשר ממשק הוא ממשק כללי המכיל יחיד שִׂיחָה() שיטה - המחזירה ערך כללי ו:

ממשק ציבורי ניתן להתקשרות {V call () זורק חריג; }

בואו נסתכל על חישוב הפקטוריון של מספר:

מחלקה ציבורית FactorialTask ​​מיישמת ניתן להתקשר למספר {int; // בונים סטנדרטיים שיחת שלם ציבורית () זורקת InvalidParamaterException {int fact = 1; // ... עבור (int count = number; count> 1; count--) {fact = fact * count; } להחזיר עובדה; }}

התוצאה של שִׂיחָה() השיטה מוחזרת בתוך a עתיד לְהִתְנַגֵד:

@ מבחן ציבורי בטל כאשר משימת הגשה_טהן-פורט-ריבוטבינט () {משימת משיכה = FactorialTask ​​חדשה (5); עתיד עתידי = executorService.submit (משימה); assertEquals (120, future.get (). intValue ()); }

4. טיפול בחריגים

בואו נראה עד כמה הם מתאימים לטיפול בחריגים.

4.1. עם ניתן לרוץ

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

4.2. עם ניתן להתקשר

ניתן להתקשר לשיחה () השיטה מכילה "זורק יוצא מן הכלל" סעיף כך שנוכל להפיץ בקלות עוד חריגים מסומנים:

מחלקה ציבורית FactorialTask ​​מיישמת הניתנת להתקשרות {// ... שיחה ציבורית שלמה () זורקת InvalidParamaterException {if (number <0) {throw new InvalidParamaterException ("המספר צריך להיות חיובי"); } // ...}}

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

@Test (צפוי = ExecutionException.class) בטל פומבי כאשרException_ThenCallableThrowsIt () {FactorialCallableTask משימה = FactorialCallableTask חדש (-5); עתיד עתידי = executorService.submit (משימה); תוצאה שלמה = future.get (). IntValue (); }

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

אם אנחנו לא מתקשרים אל לקבל() שיטה של עתיד בכיתה - ואז החריג שנזרק על ידי שִׂיחָה() השיטה לא תדווח בחזרה, והמשימה עדיין תסומן כמושלמת:

@ מבחן ציבורי בטל כאשרException_ThenCallableDoesntThrowsItIfGetIsNotCalled () {FactorialCallableTask task = new FactorialCallableTask (-5); עתיד עתידי = executorService.submit (משימה); assertEquals (false, future.isDone ()); }

הבדיקה שלעיל תעבור בהצלחה למרות שזרקנו חריג לערכים השליליים של הפרמטר FactorialCallableTask.

5. מסקנה

במאמר זה בחנו את ההבדלים בין ניתן לרוץ ו ניתן להתקשר ממשקים.

כמו תמיד, הקוד השלם למאמר זה זמין באתר GitHub.


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