Способ справиться с этим - зарегистрировать shutdown hook. Если вы используете ( SIGINT ) kill -2
, из-за этого программа изящно выйдет и запустит блокировку отключения.
Регистрирует новую виртуальную машину
отключающий крюк.
Виртуальная машина Java отключается в
ответ на два вида событий:
Программа завершается нормально, когда завершается последний поток, не являющийся демоном, или когда вызывается метод выхода (эквивалентно System.exit), или
Виртуальная машина завершает работу в ответ на пользовательское прерывание, такое как ввод ^ C, или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.
Я попробовал следующую тестовую программу на OSX 10.6.3, а на kill -9
он NOT запустил ловушку завершения работы, не думал, что так будет. На kill -15
it DOES каждый раз запускается отключающий крюк.
public class TestShutdownHook
{
public static void main(final String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook ran!");
}
});
while (true)
{
Thread.sleep(1000);
}
}
}
Это документированный способ написания ваших собственных обработчиков сигналов , которые не являются перехватчиками завершения работы в Java. Будьте предупрежденными , что пакеты com.sun.misc
не поддерживаются и могут быть изменены или удалены в любое время и, вероятно, существуют только в Sun JVM.