Aktualizacja maj 2012 (2 i pół roku później)
Trejkaz Komentarze:
W aktualnych wersjach Java ten kod obsługi sygnału nie działa, ponieważ sygnał "INT
" jest "zarezerwowany przez VM lub system operacyjny".
Dodatkowo, żadna inna ważna nazwa sygnału nie zostanie wywołana, gdy coś poprosi o zamknięcie aplikacji (ja tylko skrupulatnie przetestowałem wszystkie te, o których mogłem się dowiedzieć ...)
Haczyk zamknięcia działa, ale okazuje się, że naszym przypadku nie jest wypalanie, więc następnym krokiem jest oczywiście uciekać się do rejestracji programu obsługi za JVM powrotem
w rozdziale „Integrating Signal and Exception Handling” z „Troubleshooting Guide for HotSpot VM” wymienia sygnały „SIGTERM
, SIGINT
, SIGHUP
” tylko dla systemów operacyjnych Solaris i Linux.
Wspomniano tylko o obsłudze wyjątków w systemie Windows.
Original odpowiedź (wrzesień 2009)
ShutdownHook powinien być w stanie obsługiwać tę sprawę
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
// what you want to do
}
}));
(z caveats)
Zobacz także:
jako ilustrację prostą obsługą sygnału:
public class Aaarggh {
public static void main(String[] args) throws Exception {
Signal.handle(new Signal("INT"), new SignalHandler() {
public void handle(Signal sig) {
System.out.println(
"Aaarggh, a user is trying to interrupt me!!");
System.out.println(
"(throw garlic at user, say `shoo, go away')");
}
});
for(int i=0; i<100; i++) {
Thread.sleep(1000);
System.out.print('.');
}
}
}
Jak radzić sobie z SIGINT pytanie: http://stackoverflow.com/questions/2541475/capture- sigint-in-java –