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()方法的原因