Java Практический параллелизм говорит:
При корректном отключении JVM сначала запускает все зарегистрированные обработчики отключения. Завершение работы - это незапущенные потоки, которые зарегистрированы в Runtime.addShutdownHook. JVM не дает никаких гарантий относительно порядка запуска отключающих крюков. Если какие-либо потоки приложения (daemon или nondeemon) все еще работают во время завершения работы, они продолжают работать одновременно с процессом завершения работы. Когда все перехватчики завершения завершены, JVM может выбрать запуск финализаторов, если runFinalizersOnExit имеет значение true, и затем останавливается. JVM не пытается останавливать или прерывать какие-либо потоки приложений, которые все еще работают во время завершения работы; они внезапно прекращаются, когда JVM в конце концов останавливается. Если перехватчики завершения работы или финализаторы не завершаются, то процесс упорядоченного завершения работы «зависает», и JVM должна быть внезапно закрыта. При внезапном завершении работы JVM не требуется делать ничего, кроме остановки JVM; перехватчики завершения работы не запускаются.
Я понимаю все, кроме "Если перехватчики завершения работы или финализаторы не завершаются, то процесс упорядоченного завершения работы" зависает ", и JVM должна быть внезапно закрыта . ".
Что означает" процесс упорядоченного завершения работы "зависает" "? Если перехватчики завершения работы или финализаторы не завершаются, это предотвратит отключение JVM, почему говорится "JVM должна быть внезапно закрыта"?
// shutdown hook prevent JVM from being shut down
package com.example.schedulerdemo;
import java.util.concurrent.TimeUnit;
public class EndlessShutdownHook {
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("shutdown hook started");
while (true) {
try {
TimeUnit.SECONDS.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("loop");
}
}));
// this thread will still run after I shutdown the application because of the endless shutdown hook
new Thread(() -> {
while (true) {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("fixed Rate Task");
}
}).start();
}
}