Próbuję uzyskać hak zamknięcia do pracy na moim serwerze ubuntu, jednak wydaje się, że problem z więcej niż jednego wątku. Używając podstawowego ShutdownHook, poniższy kod działa, gdy zabijam proces przy użyciu kill <PID>
, co oznacza, że aktywowane jest działanie shutdown.Zamknięcie java java z więcej niż jednego wątku
public static void main(String[] args) {
ShutdownHook shutDown = new ShutdownHook();
shutDown.attachShutDownHook();
while(true){}
}
jednak ten sam kod z dodatkowym gwintem nie
public static void main(String[] args) {
ShutdownHook shutDown = new ShutdownHook();
shutDown.attachShutDownHook();
(new Thread() {
public void run() {
while (true) {}
}
}).start();
while(true){}
}
jakieś pomysły?
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.");
}
}
Jakie zachowanie ma drugi wątek? Czy aplikacja zatrzymuje się, nie wywołując zachowania zamykającego? Mówisz też "zabij proces". Co przez to rozumiesz? Jak to kończysz? – Gray
Drugi wątek jest tylko przykładem wątku na żywo. W moim rzeczywistym przykładzie nasłuchuje połączeń na porcie i pozostaje żywy przez cały czas trwania programu. Kończę proces za pomocą 'kill'. Drugi z powyższych programów nie działa tak, jak jest, więc jest coś czego mi brakuje w odniesieniu do więcej niż jednego wątku. –
Reese
Spróbuj uruchomić 'jstack' po uruchomieniu 'kill', aby zobaczyć, które wątki wciąż działają. –
SimonC