Mục lục
Daemon thread là các thread được JVM liệt vào loại có độ ưu tiên thấp, chạy trên nền background(chạy trên nền ứng dụng, không làm ảnh hưởng đến các thread khác của chương trình) để thực thi các nhiệm vụ như dọn rác, etc. Daemon thread không thể ngăn chặn JVM tự tắt (cho dù chúng đang chạy) khi tất cả các User thread (các thread được tạo ra bởi các dev) hoàn tất quá trình thực thi. Nếu JVM tìm thấy các Daemon thread đang chạy trong khi các user thread đã hoàn tất thì nó sẽ tắt các Daemon thread sau đó tự tắt chính nó.
Các tính chất của Daemon thread
Một thread được tạo ta sẽ luôn thừa thế trạng thái daemon của thread cha của nó (Main thread). Vì vậy tất cả các thread được tạo ra bên trong main thread đều không phải là daemon thread bởi vì main thread cũng không phải là daemon thread. Tuy nhiên chúng ta có thể tại một daemon thread với setDaemon() method của Thread class.
Note: Khi JVM bắt đầu khởi chạy, nó sẽ khởi tạo một thread được gọi là main thread. Chương trình của chúng ta sẽ chạy trên main thread này. Việc đầu tiên của main thread là đi kiếm main() method để thực hiện.
Chúng ta có thể sử dụng setDaemon(boolean status) để biến một user thread thành daemon thread (setDaemon(true), hoặc ngược lại có thể biến biến deamon thread thành user thread (setDaemon(false)).
setDaemon() method chỉ được gọi trước khi thread khởi chạy (start() được gọi). Nếu gọi setDaemon() sau khi thread đã khởi tạo java sẽ ném ra IllegalThreadStateException.
Chúng ta có kiểm tra một thread có phải daemon thread hay không với isDaemon().
Ví dụ Daemon thread
Ví dụ 1: Sử dụng setDaemon() và isDaemon() để tạo và kiểm tra Daemon thread.
class DaemonThreadExample1 extends Thread { public void run() { // Checking whether the thread is Daemon or not if (Thread.currentThread().isDaemon()) { System.out.println("Daemon thread executing"); } else { System.out.println("user(normal) thread executing"); } } public static void main(String[] args) { /* Creating two threads: by default they are * user threads (non-daemon threads) */ DaemonThreadExample1 t1 = new DaemonThreadExample1(); DaemonThreadExample1 t2 = new DaemonThreadExample1(); //Making user thread t1 to Daemon t1.setDaemon(true); //starting both the threads t1.start(); t2.start(); } }
Output:
Daemon thread executing
user(normal) thread executing
Ví dụ 2:
Gọi setDaemon() sau khi thread khởi chạy gây ra IllegalThreadStateException.
public class DaemonThreadEx2 extends Thread { public void run(){ System.out.println("Thread is running"); } public static void main(String[] args){ DaemonThreadEx2 t1=new DaemonThreadEx2(); t1.start(); // It will throw IllegalThreadStateException t1.setDaemon(true); } }
Output:
Exception in thread “main” java.lang.IllegalThreadStateException
Thread is running
at java.lang.Thread.setDaemon(Thread.java:1359)
at DaemonThreadEx2.main(Finalizable.java:11)
Sự khác nhau giữa daemon thread và user thread
Sự khác nhau cơ bản giữa user thread và daemon thread là JVM sẽ không chờ daemon thread thực thi xong trong khi nó sẽ chờ cho đến khi các user thread thực thi xong.
Nguồn tham khảo
https://beginnersbook.com/2015/01/daemon-thread-in-java-with-example/