シャットダウンフック
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段階目というのが、ファイナライザが実行されるフェーズ。※ただし、ファイナライザが有効になっている場合に限る。