کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش 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 در اختیار توسعه دهنده قرار می دهد.

شماره متد
متد
شرح
1
public void setDaemon(boolean status)
مشخص می کند thread جاری باید از نوع daemon باشد یا user.
2
public boolean isDaemon()
بررسی می کند آیا thread جاری از نوع daemon است یا خیر.

مثال کاربردی ساده از تعریف یک 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
1396/08/08 3298 1201
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...