Когда JVM получает сигнал о выходе, он запускает процесс завершения работы, который запускает все потоки обработчика отключения и затем ожидает их завершения. ОС должна решить, как долго ждать, и это зависит от метода, используемого для инициирования завершения процесса. Вы можете попробовать это сами с помощью простой тестовой программы, например:
public static void main ( String[] args ) throws InterruptedException {
Runtime.getRuntime ().addShutdownHook ( new Thread () {
@Override
public void run () {
System.out.println ( "Shutdown hook" );
while ( true ) { }
}
} );
while ( true ) {
System.out.println ( "Looping" );
Thread.sleep ( 10000 );
}
}
Если вы сигнализируете процесс с помощью ctrl + c, процесс запустит ловушку завершения работы, но никогда не завершится. Если вы удалите занятую петлю из ловушки отключения, вы увидите, что она завершится после завершения ловушки.