Mỗi khi một tiến trình, mã hoặc luồng cần chạy trong Java, một ngăn xếp runtime được tạo để lưu trữ các hoạt động được thực hiện khi thực thi luồng.
Mỗi mục nhập trong ngăn xếp runtime được gọi là khung ngăn xếp (stack frame) hoặc bản ghi kích hoạt (activation record). Khi một hàm được gọi bởi tiến trình, dữ liệu liên quan của nó bị xóa khỏi ngăn xếp runtime.
Khi tất cả các hàm đã được gọi, ngăn xếp runtime sẽ trống. Điều này có nghĩa là nó cần được xóa khỏi bộ nhớ.
Lúc này, ngăn xếp runtime bị hủy và luồng cũng bị chấm dứt.
Chấm dứt luồng có thể xảy ra khi luồng hoàn thành (tự nguyện) hoặc bắt buộc (chấm dứt bất thường).
Thứ tự hủy các phần tử trong ngăn xếp runtime ngược với thứ tự tạo các mục nhập trong nhiệm vụ runtime.
Khi luồng hoạt động bình thường và hoàn thành thực thi, hàm main được gọi và mục nhập của nó sẽ được lưu trong ngăn xếp runtime. Tương tự, các hàm khác (nếu có) được gọi và mục nhập của chúng được lưu. Khi các hàm đã hoàn thành thực thi, đã đến lúc xóa các mục nhập khỏi ngăn xếp runtime. Hàm được thực thi cuối cùng là hàm đầu tiên có mục nhập bị xóa.
Khi luồng chấm dứt bất thường, có nghĩa là không thể thực thi thành công tất cả các dòng mã. Điều này có nghĩa là một ngoại lệ được ném ra vì gặp lỗi. Dưới đây là ví dụ:
Ví dụ
public class Demo{
public static void main(String[] args){
test();
}
public static void test(){
test_2();
System.out.println("Đây là phương thức test.");
}
public static void test_2(){
System.out.println(45/0);
System.out.println("Đây là phương thức chia 10 cho 0.");
}
}
Kết quả
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)
Lớp Demo chứa hàm main trong đó hàm test được gọi. Hàm test được định nghĩa trong đó hàm test_2 được gọi. Một hàm tên test_2 được định nghĩa trong đó một số được thử chia cho 0. Điều này dẫn đến một ngoại lệ được in trên console. Do đó, điều khiển không đến dòng println để in thông báo lỗi.