Ich versuche, einen Shutdown zum Herunterfahren auf meinem Ubuntu-Server zu bekommen, aber anscheinend habe ich ein Problem mit mehr als einem Thread. Mit dem grundlegenden ShutdownHook funktioniert das folgende Codebeispiel, wenn ich den Prozess mit kill <PID>
abbringe, was bedeutet, dass das Abschaltverhalten aktiviert ist.
jedoch der gleiche Code mit einem zusätzlichen Thread nicht
%Vor%Irgendwelche Ideen?
%Vor%Um ein Beispiel aus einem eigenen Projekt zu nehmen;
Meine Kernklasse erzeugt eine ganze Reihe von Worker-Threads, und die Worker führen Transaktionen aus, die abgeschlossen werden müssen.
In der Kernklasse habe ich;
%Vor%Das sieht ungefähr so aus:
%Vor% Sobald ich Ctrl+C
im Terminal anklicke, erscheint die Meldung log
. Daher wird der shutdown-Hook sofort aktiviert. Er wird nicht ausgeführt, sobald das Programm zum Sterben bereit ist, sondern wird ausgeführt, sobald die Anfrage zum Schließen oder zum Beenden empfangen wird.
Aus diesem Grund glaube ich, was andere darüber gesagt haben, dass Shutdown-Hooks niemals aufgerufen werden, solange noch ein Thread am Leben ist, ist falsch. Was wäre der Sinn eines Shutdown-Hooks, der erst aktiviert wird, wenn alles schon tot ist?
Es kann sein, dass Sie eine harte Tötung wie -9 verwenden. Haben Sie ein normales Herunterfahren mit Ctrl+C
oder SIGINT
versucht?
java.lang.Runtime.addShutdownHook( Thread )
registriert einen neuen Virtual Machine Shutdown-Hook:
Die virtuelle Java-Maschine wird als Reaktion auf zwei Arten heruntergefahren Ereignisse:
Das Programm wird normalerweise beendet, wenn der letzte Nicht-Daemon-Thread beendet wird oder wenn der Die Methode exit (äquivalent, System.exit) wird aufgerufen oder
Die virtuelle Maschine wird als Reaktion auf eine Benutzerunterbrechung beendet, wie z Geben Sie ^ C oder ein systemweites Ereignis ein, z. B. Benutzerabmeldung oder Herunterfahren des Systems.
Ihr Code läuft unbegrenzt, so dass der Shutdown-Hook niemals aufgerufen wird.
[Nach der Bearbeitung]
Welche kill
benutzen Sie?
kill -9 ist nicht abfangbar
kill -2 kann verwendet werden, um eine ctrl-c (SIGINT) zu emulieren
Tags und Links java multithreading shutdown-hook