web-dev-qa-db-ja.com

System.exitイベントをキャプチャする方法は?

私はJavaのアプリケーションを持っています。そこでは、誰かがコード内のコードSystem.exit()を終了した場合、メッセージのログ記録やリソースの解放などを行うためにリスナーを呼び出す必要があります...

どうすればそれを実装できますか、どんな提案/アプローチも歓迎します。

25
harshit

Runtime.addShutdownHook メソッドを使用して、シャットダウンフックを追加できます。これは基本的に未起動のThreadであり、Javaのシャットダウン時に実行されます。 =仮想マシン。

ただし、これは、JVMのライフサイクルの非常にデリケートな時期に実行されるため、慎重に検討する必要がある領域です。 Runtime.addShutdownHookメソッドのAPI仕様から:

シャットダウンフックは、仮想マシンのライフサイクルの微妙な時期に実行されるため、防御的にコーディングする必要があります。特に、スレッドセーフであり、可能な限りデッドロックを回避するように作成する必要があります。

いずれにせよ、シャットダウンフックがどのように機能するかを少し読んでください。十分な準備がなければ、シャットダウンフックにアプローチするべきではないでしょう。 Runtime.addShutdownHookメソッドのAPI仕様を注意深くお読みください。

この回答の情報を検索して見つけたいくつかの記事は次のとおりです。

51
coobird

関数Runtime.addShutdownHook(Thread thehook)を使用すると、フックをJava仮想マシンに登録できます。
フックは、初期化されているが開始されていないスレッドとして機能し、終了時にJVMによって呼び出されます。複数のフックを登録する場合、フックが呼び出される順序は未定義であることに注意してください。

6
Silfverstrom