مشخصات مقاله
-
1200
-
0.0
-
3296
-
0
-
0
آموزش Java – daemon thread در پردازش موازی Java
آموزش Java – daemon thread در پردازش موازی Java
Daemon thread ها برای سرویس دهی به thread های تعریف شده توسط برنامه نویس که user thread نامیده می شود، بکار می روند. چرخه ی حیات و طول عمر این نوع thread ها وابسته به user thread ها بوده و با اتمام کار thread هایی که توسعه دهنده تعریف کرده، دستگاه مجازی جاوا daemon thread ها را نیز از حافظه پاک می کند.
تعداد زیادی daemon thread به صورت خودکار در پس زمینه در حال اجرا هستند که از جمله ی آن ها می توان به gc و finalizer اشاره کرد.
برای مشاهده ی تمامی جزئیات می توانید دستور jconsole را در پنجره ی فرمان (cmd) تایپ نمایید. ابزار jconsole اطلاعاتی نظیر کلاس های بارگذاری شده در حافظه، میزان حافظه مصرف شده، thread های در حال اجرا را در اختیار برنامه نویس قرار می دهد.
نکاتی که در خصوص daemon thread ها در جاوا بایستی بخاطر داشت:
- تنها هدف این نوع thread سرویس دهی به user thread می باشد و برای thread هایی که توسعه دهنده ایجاد کرده عملیاتی را در پس زمینه اجرا می کند.
- طول عمر این نوع thread ها به thread های تعریف شده توسط برنامه نویس بستگی دارد و با اتمام کار user thread ها از حافظه پاک می شوند (خواه کار خود را به پایان رسانده باشند و خواه آن را تمام نکرده باشند).
- اولویت آن (priority) پایین تر از thread های تعریف شده توسط توسعه دهنده می باشد.
چرا daemon thread ها پس از اتمام کار user thread ها از حافظه پاک می شوند؟
تنها هدفی که daemon thread برای آن تعبیه شده اند، ارائه ی سرویس به user thread ها و انجام کارهای پس زمینه ای برای آن ها می باشد. اگر user thread ای درکار نباشد، JVM دیگر دلیلی برای نگه داشتن این thread ها نمی بیند. بنابراین زمانی که thread های توسعه دهنده کار خود را به اتمام برساند، تمامی daemon thread ها نیز از حافظه پاک می شوند.
تنها هدفی که daemon thread برای آن تعبیه شده اند، ارائه ی سرویس به user thread ها و انجام کارهای پس زمینه ای برای آن ها می باشد. اگر user thread ای درکار نباشد، JVM دیگر دلیلی برای نگه داشتن این thread ها نمی بیند. بنابراین زمانی که thread های توسعه دهنده کار خود را به اتمام برساند، تمامی daemon thread ها نیز از حافظه پاک می شوند.
کلاس java.lang.Thread دو متد جهت کار با daemon thread در اختیار توسعه دهنده قرار می دهد.
مثال کاربردی ساده از تعریف یک Daemon thread در Java
فایل: MyThread.java
public class TestDaemonThread1 extends Thread{
public void run(){
if(Thread.currentThread().isDaemon()){//checking for daemon thread
System.out.println("daemon thread work");
}
else{
System.out.println("user thread work");
}
}
public static void main(String[] args){
TestDaemonThread1 t1=new TestDaemonThread1();//creating thread
TestDaemonThread1 t2=new TestDaemonThread1();
TestDaemonThread1 t3=new TestDaemonThread1();
t1.setDaemon(true);//now t1 is daemon thread
t1.start();//starting threads
t2.start();
t3.start();
}
}
خروجی:
daemon thread work user thread work user thread work
پس از اینکه متد start() را بر روی آبجکت thread صدا زدید، دیگر نباید آن را با متد setDaemon(true) به عنوان یک daemon انتخاب کنید چرا که خطای IllegalThreadStateException رخ می دهد. به عبارت دیگر اگر می خواهید یک user thread را به daemon thread تبدیل کنید، دیگر نباید متد start() را بر روی آن فراخوانی کنید چرا که در این صورت خطای IllegalThreadStateException صادر می شود.
فایل: MyThread.java
class TestDaemonThread2 extends Thread{
public void run(){
System.out.println("Name: "+Thread.currentThread().getName());
System.out.println("Daemon: "+Thread.currentThread().isDaemon());
}
public static void main(String[] args){
TestDaemonThread2 t1=new TestDaemonThread2();
TestDaemonThread2 t2=new TestDaemonThread2();
t1.start();
t1.setDaemon(true);//will throw exception here
t2.start();
}
}
خروجی:
exception in thread main: java.lang.IllegalThreadStateException