不同的堆栈为不同的线程

时间:2014-02-10 12:16:33

标签: java multithreading

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

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

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

并且可以同时使用不同的线程调用相同的方法吗?如果可以,它是如何实现的?

4 个答案:

答案 0 :(得分:2)

让我们从此开始。

  

...在我们调用start方法之后,在类区域中加载run方法,然后调用另一个方法...

如果我不明白你的想法正在发生什么,你的描述会出现乱码。

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

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

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

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

  4. 新创建的子线程首先调用Thread.run(),然后调用run()的{​​{1}}方法。这些调用(自然地)使用我们先前分配的新线程堆栈发生。

  5. “并发”,父线程从Runnable调用返回,并继续运行,与子线程无关。


  6. 现在回答你的问题。

      

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

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

      

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

    堆栈用于保存方法调用的局部变量和参数。当您启动方法调用时,它们通过“推”一个框架(由给定方法调用的局部文件组成)操作到堆栈上。然后,当方法调用终止时,框架从堆栈“弹出”。这个方案允许方法调用其他方法,可能是递归调用,而不需要调用另一个方法的变量。

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

      

    并且可以同时使用不同的线程调用相同的方法吗?如果可以,它是如何实现的?

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

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

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


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

答案 1 :(得分:1)

  

运行方法在类区

中加载      

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

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

  • new Thread(Runnable) - 此处不同的Runnable,使用不同的run方法,可用于每个帖子;
  • 创建
  • 不同的Thread 子类,其中每个子类'run方法可以不同。
  

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

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

  

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

是的,这就是多线程的内容。

  

如果是的话,怎么可能?

要得到答案,你必须提供至少一个你认为的理由。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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