Daemond thread là gì trong multithreading

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()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/

0 0 votes
Article Rating
Subscribe
Notify of
guest
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
tung anh
tung anh
10 days ago

có 1 số chỗ bị rối quá ad ơi

1
0
Would love your thoughts, please comment.x
()
x