יישום רץ לעומת הארכת חוט

1. הקדמה

"האם עלי ליישם א ניתן לרוץ או להאריך את פְּתִיל מעמד"? זו שאלה די נפוצה.

במאמר זה נראה איזו גישה הגיונית יותר בפועל ומדוע.

2. שימוש פְּתִיל

בואו נגדיר תחילה א SimpleThread כיתה שמתארכת פְּתִיל:

מחלקה ציבורית SimpleThread מרחיב אשכול {הודעת מחרוזת פרטית; // לוגר סטנדרטי, קונסטרוקטור @Override הפעלה בטלנית ציבורית () {log.info (הודעה); }}

בואו נראה גם כיצד נוכל להריץ חוט מסוג זה:

הריקון הציבורי של @Test givenAThread_whenRunIt_thenResult () זורק חריג {Thread thread = new SimpleThread ("SimpleThread מבוצע באמצעות Thread"); thread.start (); thread.join (); }

אנחנו יכולים גם להשתמש ב- שירות ExecutorService לביצוע החוט:

@Test ציבורי בטל givenAThread_whenSubmitToES_thenResult () זורק Exception {executorService.submit (SimpleThread חדש ("SimpleThread מבוצע באמצעות ExecutorService")). Get (); }

זה די הרבה קוד להפעלת פעולת יומן בודדת בשרשור נפרד.

כמו כן, שים לב לכך SimpleThread לא יכול להאריך שום מעמד אחר, מכיוון שג'אווה אינה תומכת בירושה מרובה.

3. יישום א ניתן לרוץ

עכשיו, בואו ניצור משימה פשוטה שמיישמת את java.lang. ניתן לרוץ מִמְשָׁק:

מחלקה SimpleRunnable מיישמת Runnable {private String string; // לוגר סטנדרטי, קונסטרוקטור @Override הפעלה בטלנית ציבורית () {log.info (הודעה); }}

שלעיל SimpleRunnable זו רק משימה שאנחנו רוצים להריץ בשרשור נפרד.

ישנן גישות שונות בהן אנו יכולים להשתמש להפעלתו; אחד מהם הוא להשתמש ב- פְּתִיל מעמד:

@Test ציבורי בטל givenRunnable_whenRunIt_thenResult () זורק חריג {Thread thread = new Thread (חדש SimpleRunnable ("SimpleRunnable מבוצע באמצעות Thread")); thread.start (); thread.join (); }

אנחנו יכולים אפילו להשתמש ב- שירות ExecutorService:

@Test הציבור בטל שניתן ARARNable_whenSubmitToES_thenResult () זורק Exception {executorService.submit (SimpleRunnable חדש ("SimpleRunnable מבוצע באמצעות ExecutorService")). Get (); }

אנחנו יכולים לקרוא עוד על שירות ExecutorService פה.

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

החל מג'אווה 8, כל ממשק שחושף שיטה מופשטת אחת מתייחס לממשק פונקציונלי, מה שהופך אותו ליעד ביטוי למבדה תקף.

אנו יכולים לשכתב את האמור לעיל ניתן לרוץ קוד באמצעות ביטוי למבדה:

@Test ציבורי בטל givenARunnableLambda_whenSubmitToES_thenResult () זורק חריג {executorService.submit (() -> log.info ("Lambda runnable executed!")); }

4. ניתן לרוץ אוֹ פְּתִיל?

במילים פשוטות, אנו בדרך כלל מעודדים את השימוש ב- ניתן לרוץ על פְּתִיל:

  • בעת הרחבת ה- פְּתִיל בכיתה, איננו עוקפים אף אחת משיטותיה. במקום זאת, אנו עוקפים את השיטה של ניתן לרוץ (איזה פְּתִיל במקרה מיישם). זו הפרה ברורה של IS-A פְּתִיל עִקָרוֹן
  • יצירת יישום של ניתן לרוץ ולהעביר אותו ל פְּתִיל בכיתה משתמשת בקומפוזיציה ולא בירושה - שהיא גמישה יותר
  • לאחר הארכת ה- פְּתִיל בכיתה, איננו יכולים להרחיב שום שיעור אחר
  • מג'אווה 8 ואילך, Runnables ניתן לייצג כביטויים למבדה

5. מסקנה

במדריך מהיר זה ראינו כיצד מיישמים ניתן לרוץ היא בדרך כלל גישה טובה יותר מאשר הרחבת ה- פְּתִיל מעמד.

את הקוד לפוסט זה ניתן למצוא ב- GitHub.