Как CTRL-C работает с программой Java

Когда я нажимаю ctrl-c в консоли, в какой последовательности останавливаются потоки приложения и вызываются перехватчики завершения работы?


person user590444    schedule 11.07.2012    source источник
comment
чтобы процитировать документы:Когда виртуальная машина начинает свое завершение работы sequence, он запустит все зарегистрированные перехватчики выключения в каком-то неопределенном порядке и позволит им работать одновременно. Когда все перехватчики закончат работу, он запустит все незадействованные финализаторы, если была включена финализация при выходе. таким образом, мы можем понять, что перехватчики выключения всегда вызываются первыми, независимо от того, что имеет смысл или какой смысл в таком хук, если потоки закрыты 1-м? Чтобы сообщить пользователю, что его данные утеряны   -  person David Kroukamp    schedule 11.07.2012


Ответы (2)


Согласно javadocs, зарегистрированные перехватчики выключения вызываются в неуказанном порядке, когда JVM начинает выключаться; например в ответ на CTRL-C.

Потоки приложений не "останавливаются" каким-либо определенным образом. На самом деле, они могут продолжать работать до тех пор, пока процесс не завершится.

Если вы хотите, чтобы ваши потоки закрывались упорядоченным образом, вам нужно сделать что-то в хуке выключения, чтобы это произошло. Например, хук выключения может вызвать Thread.interrupt(), чтобы сказать рабочим потокам прекратить то, что они делают... и вызвать join(), чтобы убедиться, что это произошло.

person Stephen C    schedule 11.07.2012
comment
Осторожность; Thread.join() может вызвать взаимоблокировку во время завершения работы, ожидая потока, который не соблюдает прерывание. Рекомендуется использовать Thread.join(long) с разумным тайм-аутом, чтобы гарантировать, что некорректно работающие потоки не блокируют завершение процесса. - person dimo414; 14.08.2015
comment
Хорошая точка зрения. Однако, если у вас есть поток, который неправильно реагирует на прерывание, и вы все равно отключаете JVM, то существует риск того, что что-то может быть повреждено. Итак, ИМО, лучший подход - найти и устранить причину тупика; то есть изменить поток-нарушитель, чтобы правильно обрабатывать прерывания. - person Stephen C; 14.08.2015

Я знаю, что вы можете указать, что должно происходить при нажатии Ctrl-C, добавив перехватчик выключения. Но я не уверен, в каком порядке.

private static void createShutDownHook()
{
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
    {

        @Override
        public void run()
        {
            System.out.println();
            System.out.println("Thanks for using the application");
            System.out.println("Exiting...");

        }
    }));
}
person Martijn Courteaux    schedule 11.07.2012