A little bit of everything

元・情報系大学院生の備忘録

シャットダウンフック

JVMの終了時に何らかの処理をさせることが可能です。
この「JVM終了時に実行する処理」を記述したスレッドのことをシャットダウンフック(ShutdownHook)と呼びます。

ここで言う「JVMの終了時」とは、以下のものを指します。

  • System.exit() が呼ばれた場合
  • ユーザ割込みでJVMを停止させた場合(Ctrl+Cとか)
  • デーモンスレッド以外の全スレッドが終了した場合


シャットダウンフックの使い方

JVM終了時に処理させたい内容をrun()に記述したスレッドをつくります。
こんなかんじで↓

class ShutdownHookTest implements Runnable {
    public void run() {
        System.out.println("終わったよ!");
  }
}

※このスレッドこそがシャットダウンフックです。


で、こいつをaddShutdownHookメソッドを使ってRuntimeに渡します。
こんなかんじ↓

Runtime.getRuntime().addShutdownHook(new ShutdownHookTest());



もちろん、シャットダウンフックの作成+Runtimeへの登録を一括でやってもOKです。

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        System.out.println("終わったよ!");
    }
});



シャットダウンフックは「初期化されただけで起動していないスレッド」で、これをJavaのRuntimeに登録しておけば、JVMがシャットダウンシーケンスに入った時にシャットダウンフックが動きだします。
JVMのシャットダウンシーケンスは2段階で構成されていて、1段階、2段階と終了すると、JVMが停止します。
シャットダウンシーケンスは1段階目に入った時に実行されます。
ちなみに2段階目というのが、ファイナライザが実行されるフェーズ。※ただし、ファイナライザが有効になっている場合に限る。

注意点

javawを使ってJavaを動かしている場合は、シャットダウンフックは呼ばれないらしいです。
Eclipseはjavawを使っているので、Eclipse上ではシャットダウンフックが使えないようです。