Java Tutorial

Java Control Statements

Object Oriented Programming

Java Built-in Classes

Java File Handling

Java Error & Exceptions

Java Multithreading

Java Synchronization

Java Networking

Java Collections

Java List Interface

Java Queue Interface

Java Map Interface

Java Set Interface

Java Data Structures

Java Collections Algorithms

Java Miscellaneous

Advanced Java

Java APIs & Frameworks

Java Useful Resources

Java - JVM Shutdown Hook



JVM Shutdown

The following are the two different ways for JVM shutdown –

  • A controlled process: JVM starts to shut down its process if the System.exit() method is called, CTRL+C is pressed, or if the last non-daemon thread terminates.

  • An abrupt manner: JVM starts to shut down its process if it receives a kill signal, the Runtime.getRuntime().halt() method is called, or any kind of OS panic.

JVM Shutdown Hook

A shutdown hook is simply an initialized but unstarted thread. When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks in some unspecified order and let them run concurrently. When all the hooks have finished it will then run all uninvoked finalizers if finalization-on-exit has been enabled. Finally, the virtual machine will halt. Note that daemon threads will continue to run during the shutdown sequence, as will non-daemon threads if shutdown was initiated by invoking the exit method.

JVM Shutdown Hook: The addShutdownHook(Thread hook) Method

The Runtime addShutdownHook(Thread hook) method registers a new virtual-machine shutdown hook.

Declaration

Following is the declaration for java.lang.Runtime.addShutdownHook() method

public void addShutdownHook(Thread hook)

Parameters

hook − An initialized but unstarted Thread object.

Return Value

This method does not return a value.

Exception

  • IllegalArgumentException − If the specified hook has already been registered, or if it can be determined that the hook is already running or has already been run.

  • IllegalStateException − If the virtual machine is already in the process of shutting down.

  • SecurityException − If a security manager is present and it denies RuntimePermission("shutdownHooks").

Example of JVM Shutdown Hook

In this example, we're creating a class CustomThread by extending Thread class. This thread object will be used as JVM Shutdown hook. CustomThread class has run() method implementation. In main class TestThread, we've added a shutdown hook using Runtime.getRuntime().addShutdownHook() method, by passing it a thread object. In output you can verify that CustomThread run() method is called when program is about to exit.

package com.tutorialspoint;

class CustomThread extends Thread {
   public void run() {
      System.out.println("JVM is shutting down.");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      try {
         // register CustomThread as shutdown hook
         Runtime.getRuntime().addShutdownHook(new CustomThread());
         // print the state of the program
         System.out.println("Program is starting...");
         // cause thread to sleep for 3 seconds
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         // print that the program is closing
         System.out.println("Program is closing...");
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Output

Program is starting...
Waiting for 3 seconds...
Program is closing...
JVM is shutting down.

More Example of JVM Shutdown Hook

Example 1

In this example, we're creating a class CustomThread by implementing Runnable interface. This thread object will be used as JVM Shutdown hook. CustomThread class has run() method implementation. In main class TestThread, we've added a shutdown hook using Runtime.getRuntime().addShutdownHook() method, by passing it a thread object. In output you can verify that CustomThread run() method is called when program is about to exit.

package com.tutorialspoint;

class CustomThread implements Runnable {
   public void run() {
      System.out.println("JVM is shutting down.");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      try {
         // register CustomThread as shutdown hook
         Runtime.getRuntime().addShutdownHook(new Thread(new CustomThread()));
         // print the state of the program
         System.out.println("Program is starting...");
         // cause thread to sleep for 3 seconds
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         // print that the program is closing
         System.out.println("Program is closing...");
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Output

Program is starting...
Waiting for 3 seconds...
Program is closing...
JVM is shutting down.

Example 2

We can remove the shutdown hook as well using removeShutdownHook(). In this example, we're creating a class CustomThread by implementing Runnable interface. This thread object will be used as JVM Shutdown hook. CustomThread class has run() method implementation. In main class TestThread, we've added a shutdown hook using Runtime.getRuntime().addShutdownHook() method, by passing it a thread object. As last statement, we're removing the hook using Runtime.getRuntime().removeShutdownHook() method

package com.tutorialspoint;

class CustomThread implements Runnable {
   public void run() {
      System.out.println("JVM is shutting down.");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      try {
         Thread hook = new Thread(new CustomThread());
         // register Message as shutdown hook
         Runtime.getRuntime().addShutdownHook(hook);
         // print the state of the program
         System.out.println("Program is starting...");
         // cause thread to sleep for 3 seconds
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         // print that the program is closing
         System.out.println("Program is closing...");
		  Runtime.getRuntime().removeShutdownHook(hook);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Output

Program is starting...
Waiting for 3 seconds...
Program is closing...
Advertisements