Когда я нажимаю ctrl-c в консоли, в какой последовательности останавливаются потоки приложения и вызываются перехватчики завершения работы?
Как CTRL-C работает с программой Java
Ответы (2)
Согласно javadocs, зарегистрированные перехватчики выключения вызываются в неуказанном порядке, когда JVM начинает выключаться; например в ответ на CTRL-C.
Потоки приложений не "останавливаются" каким-либо определенным образом. На самом деле, они могут продолжать работать до тех пор, пока процесс не завершится.
Если вы хотите, чтобы ваши потоки закрывались упорядоченным образом, вам нужно сделать что-то в хуке выключения, чтобы это произошло. Например, хук выключения может вызвать Thread.interrupt()
, чтобы сказать рабочим потокам прекратить то, что они делают... и вызвать join()
, чтобы убедиться, что это произошло.
Thread.join()
может вызвать взаимоблокировку во время завершения работы, ожидая потока, который не соблюдает прерывание. Рекомендуется использовать Thread.join(long)
с разумным тайм-аутом, чтобы гарантировать, что некорректно работающие потоки не блокируют завершение процесса.
- person dimo414; 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...");
}
}));
}