addShutdownHook

1876 ワード

public void addShutdownHook(Thread hook)

フックを閉じるために新しい仮想マシンを登録します.
Java仮想機会は、次の2つのイベントに応答するためにオフになります.
  • プログラムは正常に終了する.これは、最後の非デーモンスレッドが終了したとき、またはexit(System.exitに等しい)メソッドが呼び出されたときに発生する.または、
  • .
  • ユーザーの割り込みに応答するために、^Cなどの仮想マシンを終了する.ユーザーのログアウトやシステムのシャットダウンなどのシステムイベントが発生します.

  • フックを閉じるのは、初期化されているがまだ起動していないスレッドにすぎません.仮想マシンがシャットダウンシーケンスを有効にすると、登録されているすべてのシャットダウンフックが指定されていない順序で起動し、同時に実行されます.すべてのフックを実行した後、終了終了が有効になっている場合、仮想マシンは呼び出されていないすべての終了メソッドを実行します.最後に、仮想機会は一時停止します.シーケンスのクローズ中にデーモンスレッドが実行され続け、exitメソッドを呼び出してシーケンスのクローズを開始すると、非デーモンスレッドも実行され続けます.
    シーケンスのクローズが開始されると、haltメソッドを呼び出すことによってのみシーケンスを停止することができ、このメソッドは仮想マシンを強制的に終了することができる.
    クローズシーケンスが開始されると、新しいクローズフックを登録したり、以前に登録したフックを登録解除したりすることはできません.これらの操作を実行しようとすると、IllegalStateExceptionが放出されます.
    フックを閉じると、仮想マシンのライフサイクル中の特定の時間に動作するため、保護的に符号化する必要があります.特に、クローズフックはスレッドが安全であり、デッドロックをできるだけ避けるように記述する必要があります.フックを閉じるには、特定のサービスに盲目的に依存する必要はありません.これらのサービスは、自分のフックを登録している可能性があるので、それ自体が閉じている可能性があります.たとえば、AWTイベント割り当てスレッドなどの他のスレッドベースのサービスを使用しようとすると、デッドロックが発生する可能性があります.
    フックを閉じるには、作業を迅速に完了する必要があります.プログラムがexitを呼び出すと、仮想マシンは迅速に閉じて終了する必要があります.ユーザーがログアウトしたり、システムがシャットダウンしたりして仮想マシンを終了した場合、最下位のオペレーティングシステムでは、一定の時間内にシャットダウンして終了することしかできません.したがって、フックを閉じるときに任意のユーザインタラクションを試みたり、長時間の計算を実行したりすることは賢明ではありません.
    他のすべてのスレッドと同様に、スレッドThreadGroupオブジェクトのuncaughtExceptionメソッドを呼び出すことによって、閉じたフックで未取得の例外を処理することができる.この方法のデフォルトの実装は、この異常なスタックトラッキングをSystem.errに印刷し、スレッドを終了することである.仮想マシンが終了したり一時停止したりすることはありません.
    わずかな場合、仮想マシンは中止される可能性があります.つまり、完全に閉じていないと停止します.仮想マシンが外部で終了すると、UnixでSIGKILL信号を使用するか、Microsoft WindowsでTerminateProcessを呼び出すなどの現象が発生します.内部データ構造が破損したり、存在しないメモリにアクセスしようとしたりしたため、ネイティブメソッドの実行エラーが発生した場合、仮想マシンも中止される可能性があります.仮想マシンが中止された場合、シャットダウンフックが実行されるかどうかは保証されません.