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

时间:2013-12-18 10:56:36

标签: java multithreading

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

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

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

来自start()方法他们正在调用native方法start0(),这可能会导致调用run()类的Thread方法导致用户定义{ {1}}要执行的方法。

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

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 = HelloThread的实例是本机方法的(target = null)责任吗?如果我扩展start0()类,我的run()方法是如何被调用的?

3 个答案:

答案 0 :(得分:1)

  

在扩展Thread类

的情况下,如何调用我的run()方法

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

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

答案 1 :(得分:1)

new HelloThread()

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

如果您看到docs的run()方法,则会明确说明

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

答案 2 :(得分:0)

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