Java 扩展Thread类时如何调用run()方法

Java 扩展Thread类时如何调用run()方法,java,multithreading,Java,Multithreading,在浏览java.lang.Thread类的源代码时。奇怪的是,我想看看线程类如何调用run()方法(用户定义的run())。当我实现Runnable接口时,如下所示 Thread waiterThread = new Thread(waiter, "waiterThread"); waiterThread.start(); 在上面的代码中,从Thread类的构造函数init()方法被调用,并且从那里他们将Runnable实例初始化为this.target=target 他们从start()方法

在浏览
java.lang.Thread
类的源代码时。奇怪的是,我想看看线程类如何调用
run()
方法(用户定义的run())。当我实现
Runnable
接口时,如下所示

Thread waiterThread = new Thread(waiter, "waiterThread");
waiterThread.start();
在上面的代码中,从
Thread
类的构造函数
init()
方法被调用,并且从那里他们将
Runnable
实例初始化为
this.target=target

他们从
start()
方法调用
native
方法
start0()
,然后调用
Thread
类的
run()
方法,从而执行用户定义的
run()
方法

以下是Thread类的
run()
方法实现:

 @Override
public void run() {
    if (target != null) {
        target.run();
    }
}
我的问题是什么时候扩展
java.lang.Thread
类,什么时候调用
start()
方法,如下所示

public class HelloThread extends Thread {

  public void run() {
    System.out.println("Hello from a thread!");
  }

  public static void main(String args[]) {
      (new HelloThread()).start();
   }

 }
target=null
在上述情况下,本机方法(
start0()
)是否有责任设置target=HelloThread的实例?当我扩展
线程
类时,如何调用我的
run()
方法

当我扩展Thread类时,如何调用我的run()方法

因为你延长了课程。您可以重写run()方法来执行不同的操作。@Override注释用于突出显示此方法重写父方法

目标
不会神奇地改变,您在代码中忽略了它

new HelloThread()
它本身将调用将设置目标的
init()
方法。如果您正在扩展线程类,它将被设置为null。所以目标将为空

如果您看到for run()方法,它会清楚地说

如果此线程是使用单独的可运行运行运行对象构建的,则调用该可运行对象的运行方法;否则,此方法不执行任何操作并返回。线程的子类应重写此方法。

在start()方法中-将在start()方法中调用底层运行时对象run()方法。在这里,底层运行时对象是HelloThread类对象。这就是调用HelloThread的run()方法的原因