Was ist und wozu dient ein Shutodown Hook?

Ein Shutdown Hook ist ein ungestarteter Thread, der beim Beenden des Programms gestartet wird.

Es kommt immer wieder vor, dass bestimmte Operationen beim Beenden eines Programms, auch beim unvorhergesehenen Terminieren, auf jeden Fall ausgeführt werden müssen. So sollten z.B. offenen Dateien und Datenbankverbindungen auf jeden Fall geschlossen werden.
Hierbei kann ein Shutdown Hook Verendung finden. Dies ist ein ungestarteter Thread, der der Laufzeitumgebung des Programms hinzugefügt wird und der bei der Terminierung des Programms gestartet wird.

Das Beispiel weist zwei Klassen auf. ShutdownBsp stellt einen einfachen JFrame als GUI und main() bereit. Die Programmoberfläche besitzt hier lediglich die Funktion, beim Schließen das Auslösen des Hooks zu demonstrieren.
ShutdownThread stellt die Thread-Klasse dar, die als Shutdown Hook fungiert. In ihr wird zur Demonstration lediglich eine Konsolenausgabe getätigt. Innerhalb des Konstruktors der GUI-Klasse wird die Laufzeitumgebung des Programms durch Runtime.getRuntime() ermittelt und dieser ein Objekt des Threads hinzugefügt.
Startet man das Programm öffnet sich nur das Fenster. Schließt man dies, so wird der Hook gestartet. Man registriert dies an der Konsolenausgabe.

import javax.swing.JFrame;
import javax.swing.SwingUtilities; 

public class ShutdownBsp { 

    public ShutdownBsp() { 
        Runtime.getRuntime().addShutdownHook(new ShutdownThread());
        JFrame frame = new JFrame("Shutdown Hook");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(400, 300); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(() -> new ShutdownBsp()); 
    } 


class ShutdownThread extends Thread { 
    public void run() { 
        System.out.println("Programm wird geschlossen."); 
    } 
}

Es ist durchaus möglich, auch mehrere Shutdown Hooks anzumelden. Man muss nur beachten, dass deren Ausführungsreihenfolge nicht vorhergesagt werden kann. Abhängigkeiten untereinander müssen somit vermieden werden.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.