在Java多线程中,术语call stack
和thread stack
之间是否存在语义差异?
答案 0 :(得分:11)
每个线程都有自己的调用堆栈,“调用堆栈”和“线程堆栈”是一回事。将其称为“线程堆栈”只是强调调用堆栈特定于线程。
Bill Venners calls this the Java stack:
启动新线程时,Java虚拟机会为该线程创建新的Java堆栈。如前所述,Java堆栈将线程的状态存储在离散帧中。 Java虚拟机只在Java Stacks上直接执行两个操作:它推送和弹出框架。
线程当前正在执行的方法是线程的当前方法。当前方法的堆栈帧是当前帧。定义当前方法的类称为当前类,当前类的常量池是当前常量池。在执行方法时,Java虚拟机会跟踪当前类和当前常量池。当虚拟机遇到对存储在堆栈帧中的数据进行操作的指令时,它会在当前帧上执行这些操作。
当线程调用Java方法时,虚拟机会创建一个新帧并将其推送到线程的Java堆栈中。然后,这个新帧成为当前帧。当该方法执行时,它使用该帧来存储参数,局部变量,中间计算和其他数据。
答案 1 :(得分:3)
call stack
是stack data structure
,用于存储有关计算机程序的活动子例程的信息。
你所谓的thread stack
是我假设的是一个线程的私有堆栈。
这两件事基本相同。它们都是stack data structures
。
线程的堆栈用于存储函数调用的位置,以便允许return语句返回到正确的位置
由于通常只有一个重要的调用堆栈,因此人们将其称为堆栈。
Here是有关堆栈的信息。
Here是有关基于堆栈的内存分配的信息。
答案 2 :(得分:0)
每个线程都有自己的堆栈,每个方法调用都使用该堆栈的新区域。这意味着当一个方法调用自身(递归)时,它将有一组新的局部变量。
答案 3 :(得分:-1)
当FileWriter
抛出IOException
时,运行时系统立即停止执行try
块;正在执行的方法调用未完成。然后,运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理程序。
在此示例中,当发生IOException
时,FileWriter
构造函数位于调用堆栈的顶部。但是,FileWriter
构造函数没有适当的异常处理程序,因此运行时系统会在方法调用堆栈中检查下一个方法writeList
。 writeList
方法具有两个异常处理程序:一个用于IOException
,一个用于IndexOutOfBoundsException
。