gpt4 book ai didi

java - 不同的线程有不同的栈

转载 作者:行者123 更新时间:2023-12-01 23:12:23 26 4
gpt4 key购买 nike

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

当一个线程未结束,而另一个线程被调用时,其run方法被加载,是否被加载到同一个类区域?

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

可以使用不同的线程同时调用同一个方法吗?如果可以,怎么可能?

最佳答案

让我们从这个开始。

... after we call start method, run method is loaded in class area, and then the other method are called ...

您的描述是乱码,我不明白您认为正在发生什么。

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

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

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

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

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

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

<小时/>

现在回答你的问题。

when one particular thread is not finishes,and the other thread is called ,its run method is loaded,whether it is loaded into the same class area?

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

now what's the benefit of different stack for different threads?

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

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

and can a same method be called using different thread concurrently?if yes,how it is possible?

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

could you please explain how does a thread starts?

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

<小时/>

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

关于java - 不同的线程有不同的栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com