Что лучший способ состоит в том, чтобы получить сигнал уничтожения в Java, не используя JNI. Я действительно обнаруживал sun.misc. Сигнал и sun.misc. SignalHandler и предупреждение возможности того, чтобы быть удаленным в будущих выпусках.
Был бы с помощью JNI для вызова c lib быть единственной опцией, которую я имею?
Чтобы справиться с этим, нужно зарегистрировать ловушку shutdown . Если вы используете ( SIGINT ) kill -2
, программа корректно завершит работу и запустит обработчики завершения работы.
Регистрирует ловушку выключения новой виртуальной машины.
Виртуальная машина Java выключается в ответ на события двух типов:
Программа завершается нормально, когда завершается последний недемонический поток, или когда завершается метод выхода (эквивалентно System.exit). вызывается, или
Виртуальная машина завершает работу в ответ на прерывание пользователя, такое как ввод ^ C, или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.
Я пробовал следующую тестовую программу на OSX 10.6.3, и на kill -9
она НЕ запускала ловушку выключения, не думала, что сможет. На kill -15
он ДЕЙСТВИТЕЛЬНО запускает ловушку выключения каждый раз.
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.
Взгляните на Интегрирование обработки сигналов и исключений , в котором описывается способность JVM HotSpot создавать цепочки сигналов. Тем не менее, это связано с некоторыми уловками на уровне C.
Разве для вашей цели не хватит java.lang.Runtime.addShutdownHook (Thread)
? Эти хуки запускаются JVM после завершения, включая получение SIGINT
, пока JVM может их выполнять.