不同线程的java不同堆栈
我正在读一个关于多线程的问题,这个问题浮现在我的脑海中,现在我们知道当一个线程需要启动一个线程类的实例时,在调用start方法后,run方法被加载到类区域,然后调用另一个方法 所以我的问题是,
当一个特定线程未完成,而另一个线程被调用时,其run方法被加载,是否加载到同一类区域
对于不同的线程,不同的堆栈有什么好处
可以同时使用不同的线程调用相同的方法吗?如果是,如何可能
你可以在下面搜索框中键入要查询的问题!
我正在读一个关于多线程的问题,这个问题浮现在我的脑海中,现在我们知道当一个线程需要启动一个线程类的实例时,在调用start方法后,run方法被加载到类区域,然后调用另一个方法 所以我的问题是,
当一个特定线程未完成,而另一个线程被调用时,其run方法被加载,是否加载到同一类区域
对于不同的线程,不同的堆栈有什么好处
可以同时使用不同的线程调用相同的方法吗?如果是,如何可能
# 1 楼答案
每个线程都有自己的堆栈,因为值存储在该堆栈中,所以它们可以同时调用相同的方法,除非该方法使用成员或其他共享变量
每个线程都需要有自己的堆栈,否则线程会不断相互干扰
# 2 楼答案
我相信你在这里有一个误解:一个
Thread
要么是被创造出来的:new Thread(Runnable)
-这里可以为每个线程使用不同的Runnable
,使用不同的run
方法李>Thread
的不同子类,其中该子类run
方法每次都可以不同李>每个线程都是独立的执行行,因此每个线程都需要自己的调用堆栈
是的,这就是多线程的含义
要得到这个问题的答案,你必须至少提供一个你认为这是不可能的理由
# 3 楼答案
每个线程都有自己的堆栈,因为每个线程可能包含自己的变量、资源等
可以从不同的线程并发调用相同的方法,因为每个线程都有自己的程序计数器,因此当发生上下文切换时,每个线程都知道下一步应该处理哪一行。唯一需要考虑的是,如果调用方法中使用了一些共享变量/资源,如果是这样的话,您应该处理它。p>
# 4 楼答案
让我们从这个开始
你的描述乱七八糟,以至于我不明白你认为发生了什么
实际发生的情况如下。。。假设您使用的是
Thread
而不是Thread
的子类父线程创建
Thread
实例,提供一个Runnable
对象作为构造函数参数。Runnable
保存在Thread
对象的私有变量中父线程在新的
Thread
对象上调用start()
JVM分配一个新的线程堆栈,并请求操作系统(通常)使用该堆栈创建和启动一个新的本机线程
新创建的子线程首先调用
Thread.run()
,然后调用Runnable
的run()
方法。这些调用(自然地)使用我们以前分配的新线程堆栈进行“并发”,父线程从
start()
调用返回,并独立于子线程继续运行现在谈谈你的问题
这对我来说毫无意义。您的短语“加载到同一类区域”与实际发生的情况不一致
堆栈用于保存方法调用的局部变量和参数。它们通过在启动方法调用时将帧(由给定方法调用的局部变量组成)推送到堆栈上来操作。然后,当方法调用终止时,帧从堆栈中“弹出”。该方案允许方法调用其他方法,可能是递归的,而不需要一个调用践踏另一个方法的变量
如果有两个线程“并发”执行,它们将独立地执行对不同方法的不同调用序列。如果(假设)将帧放在一个堆栈上,那么两个线程将通过各自的堆栈推送和弹出操作相互干扰
是的。。。因为不同的线程都有不同的堆栈来保存各自的变量。见上文
我上面的描述涵盖了这一点
注意,我在上面的引号中同时使用了这个词。我想强调的是,没有规定两个动作/动作序列是否“同时”发生。它们可能会这样做(例如,如果您有多个内核)。。。或者动作可以以某种方式交错。实际行为取决于您的Java平台,在不同的运行/执行中可能会有所不同