[英]If a method belongs to another class that extends Thread but is called from the main thread, will it be executed by main or a child thread? (Java)
[英]Calling a method of a class which extends Thread, from another class
我知道这是一个有点天真的问题,但我想了解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
}
}
方法调用背后没有魔力。 如果从线程调用方法,则在完全相同的线程中调用它。 因此,从main
调用obj.func1()
,它将在主线程中运行。 它属于哪个类或者是否扩展Thread
无关紧要。
新线程从执行run
开始。 从run等调用的所有东西都将与main
并行执行。
您的代码存在多个问题。 我更正了它们并添加了一个语句来在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
理解线程和Thread
之间的区别非常重要。
线程是代码的独立执行。 通常,当我们谈论某个方法或其他方法如何工作时,我们会说“它测试变量x
,如果x
小于零,则调用foobar
方法......”
好的,那句话中的“它”是什么? 这不是方法。 方法什么都不做 。 一个方法只是一个指令列表,比如有人留给他们的室友执行的家务清单。 这份清单不做家务,而是工作的室友(或许我们希望如此)。
“它”是一个线程 。 线程是操作系统中执行方法的实体(即,他们做家务)。
另一方面, Thread
是一个Java对象,程序可以使用它来创建和管理新线程 。 您的程序通过执行以下操作创建新的Thread
对象:
thread t = new Thread(...);
[哎呀! 看看我刚才做了什么? 这不是你的程序 ,它可以完成工作,它是程序的主线程 ,也可能是程序中的其他一些线程。 这是一件容易忘记的事!]
无论如何,它随后通过调用t.start();
创建新线程 t.start();
一旦你理解了这一切,那么Sergey Tachenov的答案就变得很明显了:调用Thread
对象的方法与调用任何其他类型的对象的方法没有什么不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.