FREE E LEARNING PLATFORM
HOMEEXCEPTIONSOOPSJVMINTRO
 

Daemon thread in Java





Daemon thread is a low priority thread (in context of JVM) that runs in background to perform tasks such as garbage collection (gc) etc., they do not prevent the JVM from exiting (even if the daemon thread itself is running) when all the user threads (non-daemon threads) finish their execution. JVM terminates itself when all user threads (non-daemon threads) finish their execution, JVM does not care whether Daemon thread is running or not, if JVM finds running daemon thread (upon completion of user threads), it terminates the thread and after that shutdown itself.

Properties of Daemon threads:

  1. A newly created thread inherits the daemon status of its parent. That's the reason all threads created inside main method (child threads of main thread) are non-daemon by default, because main thread is non-daemon. However you can make a user thread to Daemon by using setDaemon() method of thread class.

    Just a quick note on main thread: When the JVM starts, it creates a thread called “Main”. Your program will run on this thread, unless you create additional threads yourself. The first thing the “Main” thread does is to look for your static void main (String args[]) method and invoke it. That is the entry-point to your program. If you create additional threads in the main method those threads would be the child threads of main thread.
  2. Methods of Thread class that are related to Daemon threads:

    public void setDaemon(boolean status): This method is used for making a user thread to Daemon thread or vice versa. For example if I have a user thread t then t.setDaemon(true) would make it Daemon thread. On the other hand if I have a Daemon thread td then by calling td.setDaemon(false) would make it normal thread(user thread/non-daemon thread).

    public boolean isDaemon(): This method is used for checking the status of a thread. It returns true if the thread is Daemon else it returns false.

  3. setDaemon() method can only be called before starting the thread. This method would throw IllegalThreadStateException if you call this method after Thread.start() method. (refer the example)
  4. Daemon thread examples

    Example 1: DaemonThreadExample1.java

    This example is to demonstrate the usage of setDaemon() and isDaemon() method.

    public 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

    Example 2: DaemonThreadEx2.java

    If you call the setDaemon() method after starting the thread (start() method), it would throw IllegalThreadStateException. This clearly means that you can call setDaemon() method only before starting a thread.

    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" Thread is running
    java.lang.IllegalThreadStateException
    	at java.lang.Thread.setDaemon(Unknown Source)
    	at beginnersbook.com.DaemonThreadEx2.main(DaemonThreadEx2.java:13)

    Difference between Daemon threads and non-Daemon thread (user thread)

    The main difference between Daemon thread and user threads is that the JVM does not wait for Daemon thread before exiting while it waits for user threads, it does not exit until unless all the user threads finish their execution.







    Leave Comment