Runtime.AddShutdownHook(Thread) メソッド

定義

新しい仮想マシン シャットダウン フックを登録します。

[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> プログラムは、最後のデーモン以外のスレッドが終了したとき、または (同等に) System#exit(int) System.exitメソッドが呼び出されたときに#exit exit、正常に終了します。

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

</ul>

シャットダウン フックは、単に初期化されたが開始されていないスレッドです。 仮想マシンがシャットダウン シーケンスを開始すると、登録されているすべてのシャットダウン フックが指定されていない順序で開始され、同時に実行されます。 すべてのフックが完了すると、停止します。 メソッドを呼び出 #exit exit してシャットダウンが開始された場合、デーモン スレッド以外のスレッドと同様に、デーモン スレッドはシャットダウン シーケンス中に引き続き実行されることに注意してください。

シャットダウン シーケンスが開始されたら、 メソッドを #halt halt 呼び出すことによってのみ停止できます。これにより、仮想マシンが強制的に終了します。

シャットダウン シーケンスが開始されると、新しいシャットダウン フックを登録したり、以前に登録したフックを登録解除したりすることはできません。 これらの操作のいずれかを試みると IllegalStateException 、 がスローされます。

シャットダウン フックは、仮想マシンのライフ サイクルで繊細なタイミングで実行されるため、防御的にコーディングする必要があります。 特に、スレッド セーフであり、可能な限りデッドロックを回避するように記述する必要があります。 また、独自のシャットダウン フックを登録した可能性があるため、シャットダウンの過程で自分自身が登録されている可能性があるサービスに盲目的に依存しないようにする必要があります。 たとえば、AWT イベント ディスパッチ スレッドなどの他のスレッド ベースのサービスを使用しようとすると、デッドロックが発生する可能性があります。

シャットダウン フックも作業をすばやく完了する必要があります。 プログラムが呼び出 #exit exit すと、仮想マシンがすぐにシャットダウンして終了することが期待されます。 ユーザーのログオフまたはシステムのシャットダウンによって仮想マシンが終了した場合、基になるオペレーティング システムでは、シャットダウンと終了に一定の時間しか費やされないことがあります。 そのため、ユーザーの操作を試みるか、シャットダウン フックで実行時間の長い計算を実行することはお勧めできません。

キャッチされない例外は、スレッドの オブジェクトの メソッドThreadGroupを呼び出ThreadGroup#uncaughtException uncaughtExceptionすことによって、他のスレッドと同様にシャットダウン フックで処理されます。 このメソッドの既定の実装では、例外のスタック トレースを に System#err 出力し、スレッドを終了します。仮想マシンが終了したり停止したりすることはありません。

まれな状況では、仮想マシンが 中止される可能性があります。つまり、正常にシャットダウンせずに実行を停止します。 これは、Unix 上のシグナルや TerminateProcess Microsoft Windows での呼び出しなどSIGKILL、仮想マシンが外部で終了した場合に発生します。 また、ネイティブ メソッドが内部データ構造の破損や存在しないメモリへのアクセスを試みるなどによって問題が発生した場合にも、仮想マシンが中止される可能性があります。 仮想マシンが中止された場合、シャットダウン フックが実行されるかどうかについて保証することはできません。

1.3 で追加されました。

の Java ドキュメント java.lang.Runtime.addShutdownHook(java.lang.Thread)

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

適用対象