Захват SIGINT в Java
Каков наилучший способ захвата сигнала уничтожения в Java без использования JNI. Я обнаружил sun.misc.Signal и sun.misc.SignalHandler и предупреждение о возможности удаления в будущих выпусках.
Будет ли использование JNI для вызова ac lib единственным вариантом, который у меня есть?
3 ответа
Способ справиться с этим - зарегистрировать отключение. Если вы используете (SIGINT) kill -2
заставит программу грациозно завершить работу и запустить обработчики отключения.
Регистрирует новый хук отключения виртуальной машины.
Виртуальная машина Java отключается в ответ на два вида событий:
Программа завершается нормально, когда завершается последний поток, не являющийся демоном, или когда вызывается метод exit (эквивалентно 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.
Поскольку по крайней мере Java 6, HotSpot java
команда имела -Xrs
флаг, чтобы отключить обработчики сигналов JVM.
Если вы используете его, вам нужно реализовать свой собственный SIGINT
, SIGTERM
, SIGHUP
, а также SIGQUIT
обработчики, включая один для явного вызова System.exit()
,
Примечание: это означает, что функция дампа потока SIGQUIT отключена, когда -Xrs
флаг присутствует.
См. https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html (также доступно в Windows и Solaris java
двойники).
Взгляните на Интегрирование обработки сигналов и исключений, описывающее способность JSM HotSpot делать цепочку сигналов. Это действительно вовлекает некоторую хитрость уровня C все же.
не было бы java.lang.Runtime.addShutdownHook(Thread)
будет достаточно для вашей цели? Эти хуки запускаются JVM по окончании, включая прием SIGINT
До тех пор, пока JVM сможет их выполнять.