Обновление май 2012 г. (через 2 с половиной года)
Трейказ комментарии:
В текущих версиях Java этот код обработки сигналов завершается сбоем, поскольку сигнал "INT
" зарезервирован виртуальной машиной или операционной системой.
Кроме того, ни одно из других допустимых имен сигналов на самом деле не срабатывает, когда что-то требует закрытия приложения (я просто тщательно протестировал все те, о которых я мог узнать ...)
Хук завершения работы в основном работает, но мы обнаруживаем, что в нашем случае он не срабатывает, поэтому следующим шагом, очевидно, является обращение к регистрации обработчика за спиной JVM
В главе « Интеграция обработки сигналов и исключений » в « Руководстве по устранению неполадок для HotSpot VM » упоминаются только сигналы «SIGTERM
, SIGINT
, SIGHUP
» для ОС Solaris и Linux.
Упоминается только обработка исключений в Windows.
Оригинальный ответ (сентябрь 2009 г.)
a ShutdownHook должен уметь обрабатывать этот случай
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
// what you want to do
}
}));
(с предостережениями )
Смотри также:
в качестве иллюстрации простой обработки сигналов:
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('.');
}
}
}