Java VM の終了時に何らかの処理を行いたい時は、シャットダウンフックと呼ばれるスレッドを作成し、登録しておけばよい。
方法は以下の通り。
package knowledgefort.labo.thread.shutdownhook; class ShutdownHookLabo { public static void main(String[] args) { Thread _th = new Thread(new SampleShutdownHook()); Runtime.getRuntime().addShutdownHook(_th); for (int i = 0; i < 10; i++) { System.out.println("シャットダウンフックのテスト: " + (i + 1)); } return; } } class SampleShutdownHook implements Runnable { /* (非 Javadoc) * @see java.lang.Runnable#run() */ public void run() { System.out.println("終了しました: " + super.getClass().getName()); return; } }
Runnable インタフェースを実装したクラスを作成して、終了時に実行したい処理を run() メソッド内に記述しておく。
このクラスをシャットダウンフックと呼ぶ。
※ SampleShutdownHook クラスを、Thread クラスを継承せずに作成している理由は、「マルチスレッドの実現方法(委譲による方法)」の説明どおり。
シャットダウンフックの登録は、Runtime#addShutdownHook() メソッドにて行う。
上記プログラムを実行した結果は以下の通り。
シャットダウンフックのテスト: 1 シャットダウンフックのテスト: 2 シャットダウンフックのテスト: 3 シャットダウンフックのテスト: 4 シャットダウンフックのテスト: 5 シャットダウンフックのテスト: 6 シャットダウンフックのテスト: 7 シャットダウンフックのテスト: 8 シャットダウンフックのテスト: 9 シャットダウンフックのテスト: 10 終了しました: knowledgefort.labo.thread.shutdownhook.SampleShutdownHook
main メソッドの終了時に、シャットダウンフックからのメッセージが表示される。