有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不同线程的java不同堆栈

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

当一个特定线程未完成,而另一个线程被调用时,其run方法被加载,是否加载到同一类区域

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

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


共 (4) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    run method is loaded in class area

    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?

    我相信你在这里有一个误解:一个Thread要么是被创造出来的:

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

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

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

    can a same method be called using different thread concurrently?

    是的,这就是多线程的含义

    if yes,how it is possible?

    要得到这个问题的答案,你必须至少提供一个你认为这是不可能的理由

  3. # 3 楼答案

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

    可以从不同的线程并发调用相同的方法,因为每个线程都有自己的程序计数器,因此当发生上下文切换时,每个线程都知道下一步应该处理哪一行。唯一需要考虑的是,如果调用方法中使用了一些共享变量/资源,如果是这样的话,您应该处理它。p>

  4. # 4 楼答案

    让我们从这个开始

    ... 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对象的私有变量中

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

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

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

    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?

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


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