Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

กลไกรันไทม์สแต็กใน Java


ทุกครั้งที่ต้องเรียกใช้กระบวนการหรือโค้ดหรือเธรดใน Java รันไทม์สแต็กจะถูกสร้างขึ้นเพื่อจัดเก็บการดำเนินการที่ดำเนินการในขณะที่รันเธรด

ทุกรายการในสแต็กรันไทม์เรียกว่าสแต็กเฟรมหรือบันทึกการเปิดใช้งาน เมื่อกระบวนการเรียกใช้ฟังก์ชันแล้ว ข้อมูลที่เกี่ยวข้องจะถูกลบออกจากรันไทม์สแต็ก

เมื่อเรียกใช้ฟังก์ชันทั้งหมดแล้ว สแต็กรันไทม์จะว่างเปล่า ซึ่งหมายความว่าจำเป็นต้องลบออกจากหน่วยความจำ

ณ เวลานี้ รันไทม์สแต็กจะถูกทำลาย จากนั้นเธรดจะถูกยกเลิกด้วย

การสิ้นสุดของเธรดอาจเกิดขึ้นได้เมื่อเธรดเสร็จสิ้น (โดยสมัครใจ) หรือโดยสมบูรณ์ (การสิ้นสุดแบบผิดปกติ)

ลำดับการทำลายองค์ประกอบในรันไทม์สแต็กเป็นลำดับที่ตรงกันข้ามกับการสร้างรายการในงานรันไทม์

เมื่อเธรดทำงานตามปกติ และดำเนินการเสร็จสิ้น ฟังก์ชันหลักจะถูกเรียกและรายการจะถูกเก็บไว้ในรันไทม์สแต็ก ในทำนองเดียวกัน ฟังก์ชันอื่นๆ (ถ้ามี) จะถูกเรียกใช้และรายการต่างๆ จะถูกจัดเก็บไว้ เมื่อฟังก์ชันดำเนินการเสร็จสิ้น ก็ถึงเวลาที่จะลบรายการออกจากรันไทม์สแต็ก ฟังก์ชันสุดท้ายที่ดำเนินการคือฟังก์ชันแรกที่มีการลบรายการออก

เมื่อเธรดหยุดทำงานอย่างผิดปกติ หมายความว่าทุกบรรทัดของโค้ดไม่สามารถดำเนินการได้สำเร็จ ซึ่งหมายความว่ามีข้อยกเว้นเกิดขึ้นเนื่องจากพบข้อผิดพลาด ด้านล่างนี้เป็นตัวอย่างของสิ่งเดียวกัน −

ตัวอย่าง

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' ฟังก์ชัน 'test' ถูกกำหนดโดยที่ฟังก์ชัน 'test_2' ถูกเรียก ฟังก์ชันชื่อ 'test_2' ถูกกำหนดโดยพยายามหารตัวเลขด้วย 0 ซึ่งส่งผลให้มีข้อยกเว้นที่พิมพ์บนคอนโซล ดังนั้นตัวควบคุมไม่ถึงบรรทัด 'println' เพื่อพิมพ์ข้อความแสดงข้อผิดพลาด