Java Daemon Thread Example
In this example we shall show you how to make use Java Daemon Thread, A Thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads (User, Daemon) of execution running concurrently.
A Daemon Thread is typically used to provide a general service in the background as long as the program is running like the garbage collector thread. When a Java Virtual Machine starts up, there is usually a single user (non-daemon) thread which typically calls the method named main of some designated class. The Java Virtual Machine continues to execute threads until all threads that are not daemon threads have died, JVM doesn’t wait for daemon threads to finish their execution. As soon as last non daemon thread finished, JVM terminates no matter how many daemon thread exists or running.
1. Differences between User and Daemon thread:
- JVM doesn’t wait for any daemon thread to finish before exiting.
Daemon Threadis treated differently than User Thread when JVM terminates, finally blocks are not called, Stacks are not unwounded and JVM just exits.
2. Ways to create a thread:
There are two ways to create a new thread of execution:
- Declare a class to be a subclass of
Thread. This subclass should override therun()method of classThread. An instance of the subclass can then be allocated and started. - Declare a class that implements the
Runnableinterface. That class then implements therun()method. An instance of the class can then be allocated and started.
Tip
Threadinherits its daemon nature from the parentThreadwhich creates it and since the main thread is a non daemon thread, any other thread created from it will remain non-daemon until explicitly made daemon by callingsetDaemon(true).Thread.setDaemon(true)makes aThreaddaemon but it can only be called before startingThreadin Java, otherwise It will throwIllegalThreadStateExceptionif correspondingThreadis already started and running.
3. Example:
3.1. Create a daemon thread:
We create a new DaemonThread class which extend Thread class and we override the run() method to print a simple message Daemon thread is running on the console.
DaemonThread.java:
package com.jcg;
/**
* @author ashraf
*
*/
public class DaemonThread extends Thread {
@Override
public void run() {
try {
while (true) {
System.out.println("Daemon thread is running");
Thread.sleep(1000);
}
} catch (InterruptedException ie) {
ie.printStackTrace();
} finally {
System.out.println("Daemon Thread exiting"); // never called
}
}
}
3.2. Create a user thread:
This time, we create another UserThread class which implements implements Runnable interface, we override the run() method to print a simple message User thread is running five times on the console.
UserThread.java:
package com.jcg;
/**
* @author ashraf
*
*/
public class UserThread implements Runnable {
public void run() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("User thread is running");
Thread.sleep(1000);
}
} catch (InterruptedException ie) {
ie.printStackTrace();
} finally {
System.out.println("User Thread exiting");
}
}
}
3.3. Run the example:
We create a new DaemonThreadTest class where we create a new DaemonThread and mark it as a daemon thread using setDaemon(true) then start it. Also, we create another user thread which will die after printing five messages. We will notice that when the user thread die, the JVM terminates the running daemon thread and it will die as well.
DaemonThreadTest.java:
package com.jcg;
/**
* @author ashraf
*
*/
public class DaemonThreadTest {
/**
* @param args
*/
public static void main(String[] args) {
// Create a new daemon thread and start it
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(true);
daemonThread.start();
// Create a new user thread and start it
Thread userThread = new Thread(new UserThread());
userThread.start();
}
}
Output:
Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User Thread exiting
Now let’s see what will happen when mark the first daemon thread as non daemon user thread using setDaemon(false) and running the example again using the new UserThreadTest class. We will notice that the user thread has died and the JVM still waits for daemon thread to finish its execution, it doesn’t terminates the running daemon thread.
UserThreadTest.java:
package com.jcg;
/**
* @author ashraf
*
*/
public class UserThreadTest {
/**
* @param args
*/
public static void main(String[] args) {
// Create a new daemon thread and start it
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(false);
daemonThread.start();
// Create a new user thread and start it
Thread userThread = new Thread(new UserThread());
userThread.start();
}
}
Output:
Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User thread is running Daemon thread is running User Thread exiting Daemon thread is running Daemon thread is running Daemon thread is running Daemon thread is running Daemon thread is running
4. Download the Source Code of this example:
This was an example of Java Daemon Thread.
You can download the full source code of this example here: JavaDaemonThreadExampleCode.zip
