浏览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()
方法是如何被调用的?
答案 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()方法的原因。