web-dev-qa-db-ja.com

Javaシャットダウンフック

プログラムに次のコードを追加しました。

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

ただし、メッセージが表示されません。追加情報:Netbeans内からプログラムを実行していますIDE on Java 7。

編集:プログラムを存続させるグローバルスレッドがあることを追加するのを忘れました。 Netbeansの右下隅にある[x]を押して閉じます。

11
skiwi

JVMは、整然とした方法または突然の方法でシャットダウンできます。シャットダウンフックは、正常なシャットダウンのために実行されます。最後のnormalスレッドが終了すると、誰かがSystem.exitを呼び出すか、他のプラットフォーム固有の手段(Ctrl-Cの入力など)によって呼び出します。

シャットダウンフックは、JVMの突然のシャットダウンでは実行されません。 Netbeansの右下隅にある[x]を押すと、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が出力されません。

13
Debojit Saikia

プログラムを存続させるグローバルスレッドがあることを追加するのを忘れました。 Netbeansの右下隅にある[x]を押して閉じます。

これで、netbeansの右下隅にある「x」でプログラムを閉じることは定期的にシャットダウンされるわけではなく、すべてが壊れてシャットダウンされるだけです。

ShutdownHookは、プログラムが定期的に終了する場合にのみ機能します...

2
libik