プログラムに次のコードを追加しました。
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("exit");
}
}){});
ただし、メッセージが表示されません。追加情報:Netbeans内からプログラムを実行していますIDE on Java 7。
編集:プログラムを存続させるグローバルスレッドがあることを追加するのを忘れました。 Netbeansの右下隅にある[x]を押して閉じます。
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
が出力されません。
プログラムを存続させるグローバルスレッドがあることを追加するのを忘れました。 Netbeansの右下隅にある[x]を押して閉じます。
これで、netbeansの右下隅にある「x」でプログラムを閉じることは定期的にシャットダウンされるわけではなく、すべてが壊れてシャットダウンされるだけです。
ShutdownHookは、プログラムが定期的に終了する場合にのみ機能します...