Java Shutdown-Hook mit mehr als einem Thread

8

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.

%Vor%

jedoch der gleiche Code mit einem zusätzlichen Thread nicht

%Vor%

Irgendwelche Ideen?

%Vor%     
Reese 31.10.2012, 13:15
quelle

3 Antworten

3

Die JVM wird nicht beendet, solange noch Nicht-Daemon-Threads ausgeführt werden. Versuchen Sie, setDaemon(true) für Ihren neuen Thread aufzurufen.

    
SimonC 31.10.2012 13:22
quelle
1

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?

    
lynks 31.10.2012 13:43
quelle
0

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

    
Aubin 31.10.2012 13:21
quelle