Что происходит, когда завершающие хуки или финализаторы не заканчиваются - PullRequest
2 голосов
/ 06 января 2020

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...