【发布时间】:2015-09-17 15:36:13
【问题描述】:
在 Java 多线程中,术语 call stack 和 thread stack 之间是否存在语义差异?
【问题讨论】:
-
我一直认为它们是同一个东西。但我愿意让我的世界被其他观点打破。
标签: java multithreading stack semantics
在 Java 多线程中,术语 call stack 和 thread stack 之间是否存在语义差异?
【问题讨论】:
标签: java multithreading stack semantics
每个线程都有自己的调用栈,“调用栈”和“线程栈”是一回事。将其称为“线程堆栈”只是强调调用堆栈是特定于线程的。
Bill Venners calls this the Java stack:
当一个新线程启动时,Java 虚拟机会为该线程创建一个新的 Java 堆栈。如前所述,Java 堆栈将线程的状态存储在离散帧中。 Java 虚拟机只在 Java Stacks 上直接执行两个操作:压入和弹出帧。
线程当前正在执行的方法是线程的当前方法。当前方法的堆栈帧是当前帧。定义当前方法的类称为当前类,当前类的常量池就是当前常量池。在执行方法时,Java 虚拟机跟踪当前类和当前常量池。当虚拟机遇到对堆栈帧中存储的数据进行操作的指令时,它会在当前帧上执行这些操作。
当线程调用 Java 方法时,虚拟机会创建一个新帧并将其推送到线程的 Java 堆栈中。然后这个新帧成为当前帧。当方法执行时,它使用框架来存储参数、局部变量、中间计算和其他数据。
【讨论】:
每个线程都有自己的堆栈,每个方法调用都使用该堆栈的一个新区域。这意味着当一个方法调用自己(递归)时,它会有一组新的局部变量。
【讨论】:
当FileWriter 抛出IOException 时,运行时系统立即停止执行try 块;正在执行的方法调用未完成。然后运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理程序。
在本例中,当IOException 发生时,FileWriter 构造函数位于调用堆栈的顶部。但是,FileWriter 构造函数没有适当的异常处理程序,因此运行时系统检查方法调用堆栈中的下一个方法 — writeList 方法。 writeList 方法有两个异常处理程序:一个用于IOException,一个用于IndexOutOfBoundsException。
【讨论】: