【问题标题】:different stack for different thread不同线程的不同堆栈
【发布时间】:2014-02-10 23:00:23
【问题描述】:

我正在阅读一个关于多线程的问题并且这个问题出现在我的脑海中,现在我们知道当一个线程需要启动一个线程类的实例时,然后在我们调用 start 方法之后,run 方法被加载在类区域中,然后调用其他方法 所以我的问题是,

当一个特定的线程没有完成,而另一个线程被调用时,它的run方法被加载,是否加载到同一个类区?

现在不同线程的不同堆栈有什么好处?

是否可以同时使用不同的线程调用相同的方法?如果可以,怎么可能?

【问题讨论】:

  • 如果可能请说明步骤
  • 你能解释一下线程是如何开始的吗?

标签: java multithreading


【解决方案1】:

让我们从这个开始。

...调用start方法后,类区加载run方法,然后调用其他方法...

你的描述是乱码,以至于我不明白你认为发生了什么。

实际上发生的情况如下...假设您使用的是Thread 而不是Thread 的子类。

  1. 父线程创建Thread 实例,提供Runnable 对象作为构造函数参数。 Runnable 保存在 Thread 对象的私有变量中。

  2. 父线程在新的Thread对象上调用start()。

  3. JVM 分配一个新的线程堆栈,并请求操作系统(通常)使用该堆栈创建和启动一个新的本机线程。

  4. 新创建的子线程首先调用Thread.run(),然后调用Runnable的run()方法。这些调用(自然地)使用我们之前分配的新线程堆栈进行。

  5. “同时”,父线程从start()调用返回,并继续运行,独立于子线程。


现在回答你的问题。

当一个特定的线程没有完成,而另一个线程被调用时,它的run方法被加载,是否加载到同一个类区?

这对我来说没有意义。您的短语“加载到同一类区域”与实际发生的情况不一致。

现在不同线程的不同堆栈有什么好处?

堆栈用于保存方法调用的局部变量和参数。当您开始方法调用时,它们通过将框架(由给定方法调用的局部变量组成)“推送”到堆栈上来进行操作。然后,当方法调用终止时,帧从堆栈中“弹出”。这种方案允许方法调用其他方法,可能是递归的,而不会有一个调用践踏另一个调用的变量。

如果您有两个线程“并发”执行,它们将独立执行对不同方法的不同调用序列。如果您(假设)将帧放在一个堆栈上,那么这两个线程将在各自的堆栈推送和弹出操作中相互干扰。

是否可以同时使用不同的线程调用相同的方法?如果可以,怎么可能?

是的......因为不同的线程每个都有不同的堆栈来保存各自的变量。见上文。

你能解释一下线程是如何开始的吗?

我上面的描述已经涵盖了这一点。


请注意,我在上面的引号中同时使用了这个词。我想强调的是,没有指定“同时”发生的两个动作/动作序列是否同时发生。他们可能会这样做(例如,如果您有多个内核)......或者这些操作可以以某种方式交错。实际行为取决于您的 Java 平台,并且可能因运行/执行而异。

【讨论】:

    【解决方案2】:

    类区加载run方法

    当一个特定的线程没有完成,而另一个线程被调用时,它的run方法被加载,是否加载到同一个类区?

    我相信你在这里有一个误解:Thread 要么被创建:

    • 使用new Thread(Runnable)——这里可以为每个线程使用不同的Runnable,使用不同的run 方法;
    • 或创建一个Thread的不同子类,其中该子类的run方法每次都可以不同。

    不同的堆栈对不同的线程有什么好处?

    每个线程都是一个独立的执行行,因此每个线程都需要自己的调用堆栈。

    可以同时使用不同的线程调用同一个方法吗?

    是的,这就是多线程的意义所在。

    如果是,怎么可能?

    要得到这个问题的答案,您必须提供至少一个充分的理由说明您认为不可能可能。

    【讨论】:

      【解决方案3】:

      每个线程都有自己的堆栈,因为值存储在该堆栈中,所以它们可以同时调用相同的方法 - 除非该方法使用成员或其他共享变量。

      每个线程都需要有自己的堆栈,否则线程会不断相互干扰。

      【讨论】:

      • 任何例子,它会如何干扰?
      • 如果两个线程正在访问和修改共享对象,我们可以称之为干扰。
      • 如果两个线程使用同一个堆栈,那么他们永远不会知道哪些变量属于哪个线程。当他们从一个方法返回时,他们不知道返回到哪里,等等。
      【解决方案4】:

      每个线程都有自己的堆栈,因为每个线程可能包含自己的变量、资源等。

      同一个方法可以同时从不同的线程调用,因为每个线程都有自己的程序计数器,所以当上下文切换发生时,每个线程都知道接下来应该处理哪一行。唯一的想法是应该考虑在被调用的方法中是否使用了一些共享变量/资源,如果有,你应该处理它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-30
        • 2012-01-31
        • 2020-04-25
        • 2014-10-13
        • 2015-05-12
        • 2022-11-04
        • 2010-12-11
        • 2021-08-09
        相关资源
        最近更新 更多