読者です 読者をやめる 読者になる 読者になる

A little bit of everything

情報系大学院生の備忘録

シャットダウンフック

Java では、JVMの終了時に何らかの処理をさせることが可能。
それがシャットダウンフック(ShutdownHook)。

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

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


シャットダウンフックの例

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

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

※このスレッドのことをシャットダウンフックという。


で、こいつをRuntimeに渡す。渡す時は, addShutdownHook() を使う。
こんなかんじ↓

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上ではシャットダウンフックが使えない。