Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのランタイムスタックメカニズム


プロセス、コード、またはスレッドをJavaで実行する必要があるたびに、スレッドの実行中に実行された操作を格納するためのランタイムスタックが作成されます。

ランタイムスタックのすべてのエントリは、スタックフレームまたはアクティベーションレコードと呼ばれます。プロセスによって関数が呼び出されると、関連するデータがランタイムスタックから削除されます。

すべての関数が呼び出されると、ランタイムスタックは空になります。これは、メモリから削除する必要があることを意味します。

この時点で、ランタイムスタックが破棄され、スレッドも終了します。

スレッドの終了は、スレッドが完了すると(自発的に)、または強制的に(異常終了)発生する可能性があります。

ランタイムスタック内の要素の破棄の順序は、ランタイムタスク内のエントリの作成の逆の順序です。

スレッドが正常に動作し、実行が完了すると、main関数が呼び出され、そのエントリがランタイムスタックに格納されます。同様に、他の関数(存在する場合)が呼び出され、それらのエントリが保存されます。関数の実行が完了したら、ランタイムスタックからエントリを削除します。最後に実行された関数は、エントリが削除された最初の関数です。

スレッドが異常終了した場合は、コードのすべての行を正常に実行できなかったことを意味します。これは、エラーが発生したために例外が発生したことを意味します。以下は同じ例です-

public class Demo{
   public static void main(String[] args){
      test();
   }
   public static void test(){
      test_2();
      System.out.println("This is a test method.");
   }
   public static void test_2(){
      System.out.println(45/0);
      System.out.println("This is a method that divides 10 by 0.");
   }
}

出力

Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.test_2(Demo.java:14)
at Demo.test(Demo.java:9)
at Demo.main(Demo.java:5)

Demoという名前のクラスには、「test」関数が呼び出されるmain関数が含まれています。 「test」関数が定義され、「test_2」関数が呼び出されます。 「test_2」という名前の関数が定義されており、数値を0で除算しようとします。これにより、例外がコンソールに出力されます。したがって、コントロールはエラーメッセージを出力するための「println」行に到達しません。


  1. Javaのユーザースレッドとデーモンスレッド?

    デーモンスレッド 通常、ユーザースレッドのサービスを実行するために使用されます。 main()メソッド アプリケーションスレッドのユーザースレッド(非デーモンスレッド) 。 JVM すべてのユーザースレッド(デーモン以外)がない限り、終了しません 終了します。 ユーザースレッドによって作成されたスレッドを明示的に指定できます setDaemon(true)を呼び出してデーモンスレッドになる 。メソッドisDaemon()を使用して、スレッドがデーモンスレッドであるかどうかを判断するには 。 例 public class UserDaemonThreadTest extends Thre

  2. Javaでのjoin()メソッドの重要性?

    join() 最終です スレッドの方法 クラスであり、スレッドの実行の開始を別のスレッドの実行の終了に結合するために使用できるため、別のスレッドが終了するまでスレッドの実行が開始されません。 join()の場合 メソッドがスレッドインスタンスで呼び出されると、現在実行中のスレッドは、スレッドインスタンスの実行が終了するまでブロックされます。 構文 public final void join() throws InterruptedException 例 public class JoinTest extends Thread {    public void run()