我知道这是一个有点幼稚的问题,但我想了解java中多线程背后的基本工作原理。考虑以下代码,并说A在主线程中执行,它开始执行另一个工作线程,在B类中定义。我想知道可以从A调用B.func1并运行B的方法,并行执行或不执行?
public class A {
public static void main(String[] args) {
B obj = new B();
obj.start();
obj.func1();
}
}
public class B extends Thread {
public B() {
//constructor
}
public void run() {
while(true) {
//do somethings
}
}
public void func1() {
//do someotherthings
}
}
答案 0 :(得分:5)
方法调用背后没有魔力。如果从线程调用方法,则在完全相同的线程中调用它。因此,从obj.func1()
调用main
,它将在主线程中运行。它属于哪个类或者它是否扩展Thread
并不重要。
新线程首先执行run
。从run等调用的所有内容都将与main
并行执行。
答案 1 :(得分:1)
您的代码存在多个问题。我更正了它们并添加了一个语句来在func1()中打印线程名称。
工作代码:
public class A {
public static void main(String args[]){
B obj = new B();
obj.start();
obj.func1();
}
}
class B extends Thread{
public B (){
//constructor
}
public void run(){
while(true){
//do somethings
}
}
public void func1 (){
//do someotherthings
System.out.println("Thread name="+Thread.currentThread().getName());
}
}
输出:
Thread name=main
由于您直接从main方法(A.java)调用func1(),因此输出中将获得Thread name = main
。
如果添加相同的print语句run()
方法,您将获得输出:Thread name=Thread-0
答案 2 :(得分:1)
理解线程与Yii::$app->runAction()
之间的区别非常重要。
线程是您的代码的独立执行。通常当我们谈论某个方法或其他方法如何工作时,我们会说“它测试变量Thread
,如果x
小于零,它会调用x
方法... “
好的,那句话中的“它”是什么? 它不是方法。方法不做任何事情。一个方法只是一个指令列表,比如有人留给他们的室友执行的家务清单。这个清单不做家务,而是做室内工作的室友(或许我们希望如此)。
“it”是线程。线程是操作系统中执行方法的实体(即,他们做家务)。
另一方面,foobar
是一个Java对象,您的程序可以使用它来创建和管理新的线程。您的程序通过执行以下操作创建新的Thread
对象:
Thread
[糟糕!看看我刚才做了什么?它不是你的程序,它可以完成工作,它是你程序的主线程,或者你程序中的其他一些线程。这是一件容易忘记的事情!]
无论如何,它随后通过调用thread t = new Thread(...);
一旦你理解了这一切,那么Sergey Tachenov的回答就变得很明显了:调用t.start();
对象的方法与调用任何其他类型对象的方法没有什么不同。