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

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

 Thread waiterThread = new Thread(waiter, "waiterThread"); waiterThread.start(); 

Thread类的构造函数的上面代码中,正在调用init()方法,并从那里开始将Runnable实例初始化为this.target = target

start()方法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的实例的责任吗? 以及在扩展Thread类时如何调用我的run()方法?

在扩展Thread类的情况下,如何调用我的run()方法

因为你扩展了课程。 你覆盖run()方法来做一些不同的事情。 @Override注释用于突出显示此方法会覆盖父方法。

target没有神奇地改变,你在代码中忽略了。

 new HelloThread() 

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

如果你看到run()方法的文档 ,它清楚地说

如果使用单独的Runnable运行对象构造此线程,则调用该Runnable对象的run方法; 否则,此方法不执行任何操作并返回.Strclasses of Thread应覆盖此方法。

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