【问题标题】:Difference between "call stack" and "thread stack"“调用栈”和“线程栈”的区别
【发布时间】:2015-09-17 15:36:13
【问题描述】:

在 Java 多线程中,术语 call stackthread stack 之间是否存在语义差异?

【问题讨论】:

  • 我一直认为它们是同一个东西。但我愿意让我的世界被其他观点打破。

标签: java multithreading stack semantics


【解决方案1】:

每个线程都有自己的调用栈,“调用栈”和“线程栈”是一回事。将其称为“线程堆栈”只是强调调用堆栈是特定于线程的。

Bill Venners calls this the Java stack:

当一个新线程启动时,Java 虚拟机会为该线程创建一个新的 Java 堆栈。如前所述,Java 堆栈将线程的状态存储在离散帧中。 Java 虚拟机只在 Java Stacks 上直接执行两个操作:压入和弹出帧。

线程当前正在执行的方法是线程的当前方法。当前方法的堆栈帧是当前帧。定义当前方法的类称为当前类,当前类的常量池就是当前常量池。在执行方法时,Java 虚拟机跟踪当前类和当前常量池。当虚拟机遇到对堆栈帧中存储的数据进行操作的指令时,它会在当前帧上执行这些操作。

当线程调用 Java 方法时,虚拟机会创建一个新帧并将其推送到线程的 Java 堆栈中。然后这个新帧成为当前帧。当方法执行时,它使用框架来存储参数、局部变量、中间计算和其他数据。

【讨论】:

    【解决方案2】:

    call stack 是一个stack data structure,它存储有关计算机程序的活动子例程的信息。

    您所称的thread stack 是我认为是线程的私有堆栈。

    这两件事本质上是一样的。他们都是stack data structures

    线程的堆栈用于存储函数调用的位置,以便让return语句返回到正确的位置

    由于通常只有一个重要的调用堆栈,因此人们称之为堆栈

    Here 是有关堆栈的信息。

    Here 是有关基于堆栈的内存分配的信息。

    【讨论】:

      【解决方案3】:

      每个线程都有自己的堆栈,每个方法调用都使用该堆栈的一个新区域。这意味着当一个方法调用自己(递归)时,它会有一组新的局部变量。

      【讨论】:

        【解决方案4】:

        FileWriter 抛出IOException 时,运行时系统立即停止执行try 块;正在执行的方法调用未完成。然后运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理程序。
        在本例中,当IOException 发生时,FileWriter 构造函数位于调用堆栈的顶部。但是,FileWriter 构造函数没有适当的异常处理程序,因此运行时系统检查方法调用堆栈中的下一个方法 — writeList 方法。 writeList 方法有两个异常处理程序:一个用于IOException,一个用于IndexOutOfBoundsException

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-10
          • 2011-11-20
          • 2020-10-24
          • 2016-02-25
          • 2012-02-17
          • 2016-01-19
          • 1970-01-01
          相关资源
          最近更新 更多