In the previous articles, we have seen various topics related to user threads. In this article, we will understand about daemon threads in Java, their uses, methods with examples and see differences between daemon thread vs user thread.
Table of Contents
Java Daemon thread
Daemon thread in Java is a system-generated thread that runs in the background and supports the user thread process. It is of low priority and does tasks like garbage collection, finalizer, etc. It runs automatically and we do not need to invoke it separately. The life of the daemon thread depends on the user thread which means when the user thread ends, the JVM automatically terminates the daemon threads and does not wait for daemon thread completion.
When a thread starts the execution, it inherits the daemon status of the parent’s thread. This is the reason that the main
thread in Java is a non-daemon thread and all the threads that we create are child threads. By default, these child threads are also non-daemon.
Methods of Daemon thread
Even though the daemon thread is a system-generated thread, it is possible to set a new thread as a daemon and also check if a thread is a daemon or not.
Below are the different methods of the daemon thread in Java.
Method | Description |
---|---|
void setDaemon(boolean status) | It sets the current thread as a user thread or a daemon thread. If status is true, it sets as a daemon thread, if false, it sets as a user thread |
boolean isDaemon() | Checks if the current thread is a daemon thread or a user thread. Returns true if it is a daemon thread else it returns false. |
Example
The below example demonstrates the working of setDaemon()
method and isDaemon()
methods of a Daemon thread in Java. In the run() method, we check if the thread is a user or daemon thread using the isDaemon()
method. The method returns true if it is a daemon thread else returns false. We can set the current thread as a daemon using the setDaemon()
method before calling the start()
method. The parameter should be true to set as a daemon thread else it considers as a user thread. Hence d1 is a daemon thread and d2,d3 are user threads.
public class DaemonThreadDemo extends Thread { String name; public void run() { name = Thread.currentThread().getName(); if(Thread.currentThread().isDaemon()) System.out.println(name + " is a daemon thread"); else System.out.println(name + " is a user thread"); } public static void main(String[] args) { DaemonThreadDemo d1 = new DaemonThreadDemo(); DaemonThreadDemo d2 = new DaemonThreadDemo(); DaemonThreadDemo d3 = new DaemonThreadDemo(); d1.setDaemon(true); d1.start(); d2.start(); d3.setDaemon(false); d3.start(); } }
Thread-2 is a user thread Thread-1 is a user thread Thread-0 is a daemon thread
Exceptions
Daemon threads in Java also throw exceptions in certain conditions. Suppose, we try to set a thread as a daemon thread or invoke the setDaemon()
method after the thread starts, it will throw IllegalThreadStateException. Hence, we can always use the setDaemon()
method only before calling the start()
method.
For example, the below Java code will result in an exception since we are trying to set the thread as a daemon thread after starting the thread execution.
public class DaemonException extends Thread { public void run() { System.out.println("Thread running"); } public static void main(String[] args) { DaemonException d1 = new DaemonException(); DaemonException d2 = new DaemonException(); d1.start(); d1.setDaemon(true); //Exception d2.start(); } }
Thread running Exception in thread "main" java.lang.IllegalThreadStateException at java.base/java.lang.Thread.setDaemon(Thread.java:1402) at DaemonException.main(DaemonException.java:12)
Daemon thread vs User thread
This is the most commonly asked interview question in multithreading in Java. Below are the main differences between daemon thread and user thread.
User thread | Daemon thread |
---|---|
High priority thread | Low priority thread |
Runs in foreground | Runs in background |
Performs specific complex task | Performs supporting task |
JVM always waits for active user thread to complete before shutdown | JVM does not wait for daemon thread to complete before shutdown |
Created by the Java application for executing some task | Created by the JVM |
It is independent | It depends on the user threads |
Conclusion
In this tutorial, we have seen what is a Daemon thread in Java, how to set a thread as a daemon thread and check if the current thread is a daemon or user thread. We have also seen the exception that can arise due to incorrect usage of daemon thread methods. Finally, we have discussed the major differences between daemon and user threads.