web-dev-qa-db-ja.com

JavaでCtrl + Cをキャッチ

キャッチすることは可能ですか Ctrl+C signal in a Javaコマンドラインアプリケーション?プログラムを終了する前にいくつかのリソースをクリーンアップしたいと思います。

70
Pierre

shutdown hook をVMに接続すると、VMがシャットダウンするたびに実行されます。

Java仮想マシンは、2種類のイベントに応答してシャットダウンします。

  • プログラムは、最後の非デーモンスレッドが終了したとき、またはexit(同等にSystem.exit)メソッドが呼び出されたときに正常に終了します。

  • 仮想マシンは、入力などのユーザー割り込みに応答して終了します Ctrl+C、またはユーザーのログオフやシステムのシャットダウンなどのシステム全体のイベント。

ただし、シャットダウンフックとして渡すスレッドはいくつかのルールに従う必要があるため、リンクされたドキュメントを注意深く読んで問題を回避してください。これには、スレッドの安全性の確保、スレッドの迅速な終了などが含まれます。

また、コメンターのJesperが指摘しているように、シャットダウンフックはVMの通常のシャットダウン時に実行されることが保証されていますが、VMこれは、ネイティブコードが失敗した場合、またはプロセスを強制的に強制終了した場合に発生する可能性があります(kill -9taskkill /f)。

しかし、これらのシナリオでは、とにかくすべての賭けがオフになっているので、私はそれについて考えすぎないでしょう。

81
Joey

コンソールの簡単なテストを目的としています...

Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            try {
                Thread.sleep(200);
                System.out.println("Shouting down ...");
                //some cleaning up code...

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
25
bkomac