Получите SIGINT в Java

Что лучший способ состоит в том, чтобы получить сигнал уничтожения в Java, не используя JNI. Я действительно обнаруживал sun.misc. Сигнал и sun.misc. SignalHandler и предупреждение возможности того, чтобы быть удаленным в будущих выпусках.

Был бы с помощью JNI для вызова c lib быть единственной опцией, которую я имею?

38
задан 166_MMX 7 August 2015 в 06:02
поделиться

2 ответа

Чтобы справиться с этим, нужно зарегистрировать ловушку 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.

54
ответ дан 27 November 2019 в 03:41
поделиться

Взгляните на Интегрирование обработки сигналов и исключений , в котором описывается способность JVM HotSpot создавать цепочки сигналов. Тем не менее, это связано с некоторыми уловками на уровне C.

Разве для вашей цели не хватит java.lang.Runtime.addShutdownHook (Thread) ? Эти хуки запускаются JVM после завершения, включая получение SIGINT , пока JVM может их выполнять.

4
ответ дан 27 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: