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