Runtime.AddShutdownHook(Thread) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
新しい仮想マシン シャットダウン フックを登録します。
[Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")]
public virtual void AddShutdownHook(Java.Lang.Thread? hook);
[<Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")>]
abstract member AddShutdownHook : Java.Lang.Thread -> unit
override this.AddShutdownHook : Java.Lang.Thread -> unit
パラメーター
- hook
- Thread
初期化されたが開始されていない Thread オブジェクト
- 属性
例外
フックが既に開始されている場合、またはフックが既に登録されている場合。
VM が既にシャットダウンしている場合は〘。
注釈
新しい仮想マシン シャットダウン フックを登録します。
Java仮想マシンは、次の 2 種類のイベントに応答してシャットダウンします。
<ul>
<li> プログラムは、最後のデーモン以外のスレッドが終了したとき、または (同等の#exit exit) メソッドが呼び出されたときに正常にSystem#exit(int) System.exitします。
<li> 仮想マシンは、ユーザーの割り込み (の入力など) またはシステム全体のイベント (ユーザー のログオフやシステムのシャットダウンなど) に応答して^Cします。
</ul>
シャットダウン フックは、初期化されたが開始されていないスレッドです。 仮想マシンがシャットダウン シーケンスを開始すると、登録されているすべてのシャットダウン フックが、指定されていない順序で開始され、同時に実行されます。 すべてのフックが完了すると、停止します。
#exit exit メソッドを呼び出してシャットダウンが開始された場合、デーモン 以外のスレッドと同様に、デーモン スレッドはシャットダウン シーケンス中も引き続き実行されることに注意してください。
シャットダウン シーケンスが開始されたら、仮想マシンを強制的に終了する #halt halt メソッドを呼び出すことによってのみ停止できます。
シャットダウン シーケンスが開始されると、新しいシャットダウン フックを登録したり、以前に登録したフックを登録解除したりすることはできません。 これらの操作のいずれかを試みると、 IllegalStateException がスローされます。
シャットダウン フックは、仮想マシンのライフ サイクルで繊細なタイミングで実行されるため、防御的にコーディングする必要があります。 特に、スレッド セーフであり、可能な限りデッドロックを回避するように記述する必要があります。 また、独自のシャットダウン フックを登録した可能性があるため、シャットダウンの過程で自分自身が存在する可能性があるサービスに盲目的に依存しないようにする必要があります。 たとえば、AWT イベント ディスパッチ スレッドなどの他のスレッド ベースのサービスを使用しようとすると、デッドロックが発生する可能性があります。
シャットダウン フックも、作業をすばやく完了する必要があります。 プログラムが #exit exit 呼び出すと、仮想マシンがすぐにシャットダウンして終了することが期待されます。 ユーザーのログオフまたはシステムのシャットダウンのために仮想マシンが終了した場合、基になるオペレーティング システムでは、シャットダウンと終了の一定の時間しか許可されないことがあります。 そのため、ユーザーの操作を試みるか、シャットダウン フックで実行時間の長い計算を実行することはお勧めできません。
キャッチされない例外は、他のスレッドと同様に、スレッドのThreadGroup#uncaughtException uncaughtException オブジェクトのThreadGroupメソッドを呼び出すことによって、シャットダウン フックで処理されます。 このメソッドの既定の実装では、例外のスタック トレースが System#err に出力され、スレッドが終了します。これにより、仮想マシンが終了または停止することはありません。
まれな状況では、仮想マシンが 中止される可能性があります。つまり、正常にシャットダウンせずに実行を停止します。 これは、Unix 上のSIGKILL信号やMicrosoft WindowsでのTerminateProcess呼び出しなど、仮想マシンが外部で終了した場合に発生します。 また、ネイティブ メソッドが内部データ構造を破損したり、存在しないメモリにアクセスしようとしたりすると、仮想マシンが中止される場合もあります。 仮想マシンが中止された場合、シャットダウン フックが実行されるかどうかについて保証することはできません。
1.3 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。