חוטי דמון בג'אווה

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

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

2. ההבדל בין דמון לחוטי משתמש

Java מציעה שני סוגים של שרשורים: שרשורי משתמש ושרשורי דמון.

שרשורי משתמשים הם שרשורים בעדיפות גבוהה. ה- JVM ימתין לכל שרשור משתמש שיסיים את משימתו לפני שיסיים אותו.

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

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

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

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

3. שימושים בחוטי הדמון

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

4. יצירת חוט דמון

כדי להגדיר חוט שיהיה חוט דמון, כל מה שאנחנו צריכים לעשות זה להתקשר Thread.setDaemon (). בדוגמה זו נשתמש ב- NewThread כיתה המרחיבה את פְּתִיל מעמד:

NewThread daemonThread = NewThread חדש (); daemonThread.setDaemon (נכון); daemonThread.start ();

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

השיטה setDaemon () ניתן להתקשר רק לאחר פְּתִיל האובייקט נוצר והחוט לא התחיל. ניסיון להתקשר setDaemon () בזמן שרשור חוט יזרוק IllegalThreadStateException:

@Test (צפוי = IllegalThreadStateException.class) בטל בציבור כאשר SetDaemonWhileRunning_thenIllegalThreadStateException () {NewThread daemonThread = חדש NewThread (); daemonThread.start (); daemonThread.setDaemon (נכון); }

5. בודקים אם חוט הוא חוט דמון

לבסוף, כדי לבדוק אם חוט הוא חוט דמון, אנו יכולים פשוט לקרוא לשיטה isDaemon ():

@Test ציבורי בטל כאשר CallIsDaemon_thenCorrect () {NewThread daemonThread = NewThread חדש (); NewThread userThread = חדש NewThread (); daemonThread.setDaemon (נכון); daemonThread.start (); userThread.start (); assertTrue (daemonThread.isDaemon ()); assertFalse (userThread.isDaemon ()); }

6. מסקנה

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

כמו תמיד, הגרסה המלאה של הקוד זמינה ב- GitHub.