モジュール java.base
パッケージ java.lang

クラスRuntime

java.lang.Object
java.lang.Runtime

public class Runtime extends Object
JavaアプリケーションはすべてRuntimeクラスの単一のインスタンスを持ちます。このクラスは、アプリケーションとアプリケーション実行環境とのインタフェースになります。 現在のRuntimeオブジェクトは、getRuntimeメソッドにより取得できます。

アプリケーションは、このクラスの独自のインスタンスを生成することはできません。

停止シーケンス

Java Virtual Machineは、次のいずれかのイベントにレスポンスして「停止シーケンス」を開始します:

  1. live非デーモン・スレッドの数が初めて(JNI起動APIの次のノートを参照してください)でゼロに減少した場合
  2. Runtime.exitまたはSystem.exitメソッドが初めて呼び出されたとき、または
  3. 割り込みやシグナルがオペレーティング・システムから受信されるなどの外部イベントが発生した場合。

シャットダウン・シーケンスの開始時に、登録されたシャットダウン・フックは、指定されていない順序でstartedになります。 これらは、停止シーケンスの開始時にaliveであったデーモンまたは非デーモン・スレッドと同時に実行されます。

シャットダウン・シーケンスが開始されたあと、addShutdownHookおよびremoveShutdownHookによるシャットダウン・フックの登録と登録解除は禁止されます。 ただし、新しいスレッドの作成および起動は許可されます。 新しいスレッドは、登録されたシャットダウン・フックと、すでに実行されているデーモンまたはデーモン以外のスレッドと同時に実行されます。

すべてのシャットダウン・フックが終了すると、シャットダウン・シーケンスが終了します。 この時点で、Java Virtual Machineは後述するように終了します。

たとえば、無限ループのために、1つ以上のシャットダウン・フックが終了しない可能性があります。 この場合、停止シーケンスは終了しません。 他のスレッドおよび停止フックは引き続き実行され、haltメソッドを介してJVMを終了できます。

シャットダウン・シーケンスの開始前に、プログラムがstartメソッドを明示的にコールしてシャットダウン・フックを開始できます。 これが発生した場合、停止シーケンスの動作は指定されません。

Java Virtual Machine終了

JVMは、停止シーケンスが終了したとき、またはhaltが呼び出されたときに終了します。 exitとは異なり、haltメソッドは停止シーケンスを開始しません。

JVMが終了すると、すべてのスレッドがそれ以上のJavaコードを実行できなくなります。 これには、停止フック、デーモン・スレッドおよび非デーモン・スレッドが含まれます。 たとえば、次のようになります:

  • スレッドの現在のメソッドは、通常または突然完了しません
  • finally句は実行されません
  • 「捕捉されない例外ハンドラ」は実行されません
  • try-with-resourcesでオープンされたリソースは、closedではありません

実装上のノート:
通常、ネイティブ・コードは「JNI起動API」を使用してJVMの起動と終了を制御します。 このようなネイティブ・コードは、JNI_CreateJavaVM関数を呼び出してJVMを起動します。 その後、ネイティブ・コードはDestroyJavaVM関数を呼び出して、そのJVMの終了を待機します。 DestroyJavaVM関数は、live非デーモン・スレッドの数が最初にゼロになったときに停止シーケンスを開始します。 停止シーケンスが完了し、JVMが終了すると、制御はDestroyJavaVMを起動したネイティブ・コードに戻されます。 この動作は、exitまたはhaltメソッドとは異なります。 これらのメソッドは、通常、JVMをホストしているOSプロセスを終了し、JNI起動APIとは相互作用しません。
Java言語仕様を参照してください:
「12.8 プログラム終了」
導入されたバージョン:
1.0
外部仕様
関連項目: