14.3.1 | Normale Terminierung |
exit() ist in der Klasse Runtime definiert. Die Klasse System besitzt ebenfalls eine Methode exit(), deren Implementierung jedoch die Methode exit() von Runtime aufruft.
exit() besitzt einen Parameter vom Typ int. Über diesen Parameter wird der Status festgelegt, mit dem das Programm beendet wird (Exit-Code). Auf diese Weise ist es möglich, dem Benutzer des Programms über den Exit-Code Informationen über das vorzeitige Beenden des Programms zukommen zu lassen.System.exit(1);verlässt das Programm mit dem Exit-Status 1.
Bei einer ordnungsgemäßen Beendigung des Programms sollte als Exit-Status der Wert 0 übergeben werden. Werte ungleich 0 deuten i. d. R. auf eine nicht ordnungsgemäße Terminierung hin. Die Bedeutung des Exit-Status kann in diesem Fall von der Anwendung definiert werden.
Außer Applikationen ist der Aufruf von exit() noch Applets mit erweiterten Rechten erlaubt. Andere Applets haben nicht das Recht, exit() auszuführen. Dies hat folgenden Grund: Bei Aufruf von exit() wird die Virtual Machine verlassen, in der das Applet ausgeführt wird. Hierdurch wird aber gleichzeitig auch der Browser bzw. der Appletviewer beendet, der das Applet anzeigt.
Applets werden z. B. beendet, wenn man den Browser bzw. Appletviewer beendet, in dem ein Applet abläuft. Im Browser kann ein Applet außerdem beendet werden, indem es automatisch aus dem Speicher entfernt wird, wenn Platz für neue Applets geschaffen werden muss. Der Benutzer hat jedoch keinen Einfluss darauf, wann dies geschieht. Eine ordnungsgemäße Beendigung eines Applets sollte deshalb durch Implementieren der entsprechenen Lebenszyklusmethoden realisiert werden.
Unterdem Begriff »Shutdown-Hook« versteht man Programm-Code, der bei der normalen Terminierung der Java Virtual Machine ausgeführt wird. Shutdown-Hooks können z. B. eingesetzt werden, um beim Beenden des Programms Einstellungen persistent zu speichern oder um sonstige Aufräumarbeiten durchzuführen wie das Schließen von Dateien oder von Sockets.
Shutdown-Hooks werden mit Java-Threads implementiert. Sie werden über die Runtime-Umgebung mit der Methode addShutDownHook(Thread) bei der Java Virtual Machine registriert und können mit removeShutdownHook(Thread) wieder deregistriert werden. Letzteres ist nur möglich, solange das Herunterfahren der Virtual Machine noch nicht eingeleitet ist.
Das Implementierungsmuster ist dabei folgendes:class ShutdownActions implements Runnable { public void run() { // Hier sind die Abschlußaktionen zu implementieren } } ... // Erzeugen des Threads Thread t = new Thread(new ShutdownActions()); // Registrierung Runtime.getRuntime().addShutdownHook(t);Wenn man mehrere Shutdown-Hooks registriert, werden beim Beenden der Anwendung alle registrierten Threads in einer nicht definierten Reihenfolge gestartet und nebenläufig ausgeführt. Man kann sich nicht darauf verlassen, dass sie in der Reihenfolge ausgeführt werden, in der sie registriert wurden.
Shutdown-Hooks kann man mit der finalize()-Methode von Java-Exemplaren vergleichen. Während in der finalize()-Methode Aufräumarbeiten für einzelne Exemplare implementiert werden, sind Shutdown-Hooks für applikationsweite Aufräumarbeiten vorgesehen. Außerdem ist die Ausführung von Shutdown-Hooks nur von der Art der Terminierung der Virtual Machine abhängig und nicht vom Garbage Collector. Der folgende Abschnitt zeigt ein Anwendungsbeispiel zur Verwendung von Shutdown-Hooks.