When an application is terminated normally, the application first starts any registered shutdown threads, waits for them to complete and then finally exits. Normal termination can be caused by a call to System.exit(), the completion of the last non-daemon thread, or the interruption of the application (control-C) by the user. Abnormal termination (which does not cause the shutdown threads to be started) is caused some major fault in the Java virtual machine or native library.
// Register a shutdown thread
Runtime.getRuntime().addShutdownHook(new Thread() {
// This method is called during shutdown
public void run() {
// Do shutdown work ...
}
});