שרשור דמון הוא שרשור רקע בעדיפות נמוכה שאינו מונע מה-JVM לצאת כאשר התוכנית מסיימת להפעיל
- שרשורי Daemon פועלים ברקע כדי לתמוך באשכולות משתמשים.
- ה-JVM יוצא אוטומטית כאשר כל שרשורי המשתמש (שאינם דמונים) מסתיימים.
- הם נוצרים באמצעות אותה מחלקה Thread אך מסומנים כדמון בשיטת setDaemon(true).
- יש לקרוא למתודה setDaemon(true) לפני שהשרשור מתחיל.
- דוגמאות נפוצות כוללות אספן זבל וחוט גימור.
תַחבִּיר
Javathread.setDaemon(true);
מקרי שימוש
- איסוף אשפה: אוסף הזבל (GC) ב-Java פועל כחוט דמון.
- ניטור רקע: שרשורי Daemon יכולים לנטר את מצב המשאבים או החיבורים של רכיבי האפליקציה.
- שירותי רישום וביקורת: ניתן להשתמש בשרשורי Daemon לרישום פעילויות רקע ברציפות.
- פעולות ניקוי: שרשורי Daemon עשויים לנקות מעת לעת קבצים זמניים לשחרר משאבים שאינם בשימוש או לבצע ניקוי מטמון.
- משימות מתזמן או טיימר: מתזמני רקע משתמשים לעתים קרובות בפתילים של דמונים כדי להפעיל משימות במרווחי זמן קבועים.
שיטות בשימוש
- void setDaemon(בוליאני מופעל): מסמן שרשור כדמון או שרשור משתמש. יש לקרוא לפני ההתחלה().
- boolean isDaemon(): בודק אם שרשור הוא דמון.
יצירת שרשור Daemon
Javapublic class DaemonExample extends Thread { public void run() { if (Thread.currentThread().isDaemon()) { System.out.println('Daemon thread running...'); } else { System.out.println('User thread running...'); } } public static void main(String[] args) { DaemonExample t1 = new DaemonExample(); DaemonExample t2 = new DaemonExample(); t1.setDaemon(true); // must be set before start() t1.start(); t2.start(); } }
תְפוּקָה
Daemon thread running... User thread running...
התנהגות של Daemon Thread
Javapublic class DaemonBehavior extends Thread { public void run() { while (true) { System.out.println('Daemon thread running...'); } } public static void main(String[] args) { DaemonBehavior t = new DaemonBehavior(); t.setDaemon(true); t.start(); System.out.println('Main (user) thread ends...'); } }
תְפוּקָה
Main (user) thread ends...
ה-JVM מסתיים מיד לאחר סיום השרשור הראשי למרות שרשור הדמון עדיין פועל.
הערות חשובות
- שרשור יורש את סטטוס הדמון של השרשור שיוצר אותו.
- השיטה setDaemon(true) זורקת את IllegalThreadStateException אם נקראת לאחר start().
- אין להשתמש בשרשורי Daemon עבור משימות הדורשות השלמה כגון כתיבה לקובץ או עדכון מסד נתונים.
- JVM מפסיק את כל שרשורי הדמון בפתאומיות מבלי לבצע פעולות ניקוי.
ההבדל בין חוט משתמש לשרשור Daemon
| בָּסִיס | שרשור משתמש | חוט דימון |
|---|---|---|
| מַטָרָה | מבצע משימות יישום עיקריות | מבצע שירותי רקע |
| מחזור חיים | שומר על JVM בחיים עד לסיום | מסתיים כאשר כל שרשורי המשתמש מסתיימים |
| עֲדִיפוּת | בדרך כלל גבוה יותר | בדרך כלל נמוך יותר |
| יציאת JVM | JVM מחכה להשלמה | JVM יוצא גם אם פועל |
| דוגמאות | חוטי עובד חוט ראשי | צגי רקע של אספן אשפה |