Ich versuche, einen Shutdown-Hook auf meinem Ubuntu-Server zu arbeiten, aber ich habe ein Problem mit mehr als einem Thread. Mit dem grundlegenden ShutdownHook funktioniert das folgende Codebeispiel, wenn ich den Prozess unter Verwendung von kill <PID>
abbricht, was bedeutet, dass das Abschaltverhalten aktiviert ist.Java Shutdown-Hook mit mehr als einem Thread
public static void main(String[] args) {
ShutdownHook shutDown = new ShutdownHook();
shutDown.attachShutDownHook();
while(true){}
}
jedoch dieser gleiche Code mit einem zusätzlichen Faden nicht
public static void main(String[] args) {
ShutdownHook shutDown = new ShutdownHook();
shutDown.attachShutDownHook();
(new Thread() {
public void run() {
while (true) {}
}
}).start();
while(true){}
}
Irgendwelche Ideen?
class ShutdownHook {
ShutdownHook() {
}
public void attachShutDownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Shut down hook activating");
}
});
System.out.println("Shut Down Hook Attached.");
}
}
Wie ist das Verhalten mit dem zweiten Thread? Stoppen Sie die Anwendung, ohne das Abschaltverhalten aufzurufen? Du sagst auch "Töte den Prozess". Was meinst du damit? Wie beendest du es? – Gray
Der zweite Thread ist nur ein Beispiel für einen Live-Thread. In meinem aktuellen Beispiel lauscht es auf Verbindungen an einem Port und bleibt während der gesamten Lebensdauer des Programms am Leben. Ich beende den Prozess mit 'kill'. Das zweite Programm oben funktioniert nicht so wie es ist, also fehlt mir etwas in Bezug auf mehr als einen Thread –
Reese
Versuchen Sie 'jstack' an zu laufen, nachdem Sie 'kill' aufgerufen haben, um zu sehen, welche Threads noch laufen. –
SimonC