System.exit イベントをキャプチャするにはどうすればよいですか?
質問
私はJavaでアプリケーションを持っています。誰かがコード内でコードSystem.exit()を終了した場合、メッセージのログ記録やリソースの解放などのことを行うためにリスナーが呼び出される必要があることを確認しようとしています...
どのように実装すればよいでしょうか。提案/アプローチは大歓迎です。
解決
の Runtime.addShutdownHook
メソッドを使用してシャットダウン フックを追加できます。シャットダウン フックは基本的には開始されていません Thread
, 、Java 仮想マシンのシャットダウン時に実行されます。
ただし、これは JVM のライフサイクルの非常に敏感な時期に実行されるため、慎重に扱う必要がある領域です。API仕様より Runtime.addShutdownHook
方法:
シャットダウンフックは、仮想マシンのライフサイクルで繊細な時期に実行されるため、防御的にコード化する必要があります。特に、スレッドセーフであり、可能な限りデッドロックを避けるように書かれるべきです。
いずれにせよ、十分な準備をせずにシャットダウン フックに取り組むべきではないため、シャットダウン フックがどのように機能するかについて少し読んでください。API 仕様を必ずよく読んでください。 Runtime.addShutdownHook
方法。
この回答に関する情報を検索して見つけた記事をいくつか紹介します。
シャットダウンフック -- シャットダウン時にログを記録するためにシャットダウン フックがどのように追加されるかを示す小さな例を示しています。
シャットダウンフック API の設計 -- シャットダウン フックの設計上の決定事項の一部を質疑応答形式で取り上げます。
他のヒント
関数Runtime.addShutdownHook(Thread thehook)
は、Java仮想マシンにフックを登録することができます。
フックは、終了時にJVMによって呼び出される初期化されたが未開始のスレッドとして動作します。場合には複数のフックを登録し、フックが呼び出される順序は未定義であることに注意します。