Завершение работы Java

Я добавил следующий код в мою программу:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("exit");
    }
}){});

Я однако не вижу сообщения. Дополнительная информация: Я запускаю программу из среды IDE Netbeans на Java 7.

РЕДАКТИРОВАТЬ: я забыл добавить, что существует глобальная тема, которая поддерживает программу. Я закрываю его, нажимая [x] в правом нижнем углу Netbeans.

Ответ 1

JVM может отключиться либо упорядоченным, либо резким образом. Крюк завершения работы выполняется для упорядоченного выключения: когда последний поток normal завершается, кто-то вызывает System.exit или другими средствами конкретной платформы (например, набрав Ctrl-C).

Завершение остановок не будет выполняться для внезапного отключения JVM. Когда вы нажимаете [x] в нижнем правом углу Netbeans, это приведет к резкому отключению JVM, и именно поэтому крюк отключения не был запущен.

Например:

public class ShutdownHook {
public void attachShutDownHook() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            System.out.println("exit");
        }
    });

}

public static void main(String[] args) {
    ShutdownHook sample = new ShutdownHook();
    sample.attachShutDownHook();
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Если вы запустите указанный выше код и пусть программа завершится нормально, вы увидите exit, напечатанную на консоли. Но если вы нажмете [x] (в течение 3 секунд), чтобы закрыть его внезапно, крюк выключения не будет запущен, и на консоли не будет напечатано exit.

Ответ 2

Я забыл добавить, что существует глобальный поток, который поддерживает программу в живых. Я закрываю его, нажимая [x] в нижнем правом углу Netbeans.

Ну, это то, что закрытие программы "x" в netbeans в нижнем правом углу не является регулярным выключением, оно просто ломает все и закрывает его.

ShutdownHook работает только при выходе из программы...