Bevor eine Anwendung beendet wird, möchte man öfters noch einige Einstellungen speichern, Logeinträge vornehmen oder was auch immer programmatisch erledigen lassen.
Und das Ganze am besten immer auch, wenn die Anwendung durch einen Fehler beendet wird oder der Computer heruntergefahren wird.
Dieses lässt sich durch ein Runtime.getRuntime().addShutdownHook(Runnable) lösen.
public class ShutdownHook { private static Thread shutdownHookThread; public static void main(String[] args){ shutdownHookThread = new Thread(new Runnable() { @Override public void run() { printToConsole(shutdownHookThread.getName()); } }, "ShutdownHookThread"); Runtime.getRuntime().addShutdownHook(shutdownHookThread); printToConsole("Main"); } private static void printToConsole(String threadName){ StringBuffer contentBuffer = new StringBuffer(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS"); contentBuffer.append(dateFormat.format(Calendar.getInstance().getTime())); contentBuffer.append(" ["); contentBuffer.append(threadName); contentBuffer.append("]"); contentBuffer.append(" : Anwendung beendet."); System.out.println(contentBuffer.toString()); } }
Die Ausgabe auf der Konsole würde in diesem Falle wie folgt aussehen:
2014-08-08 11:10:900 [Main] : Anwendung beendet.
2014-08-08 11:10:901 [ShutdownHookThread] : Anwendung beendet.
Hier ist gut zuerkennen das der Thread „ShutdownHookThread“ zuletzt ausgeführt wurde, auch wenn programmatisch die Zeilen andersherum stehen.
Runtime.getRuntime().addShutdownHook(shutdownHookThread); printToConsole("Main");