Thread匿名子类题目源码分析
题目描述
//阅读如下代码:
//a. 回答输出的是什么内容? 答:Thread匿名子类的run方法
//b. 为什么? 答:在Thread匿名内部类(继承了Thread的子类)上调用start方法(多态),覆盖了父类Thread中的run方法。
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable匿名子类的run方法");
}
}) {
@Override
public void run() {
System.out.println("Thread匿名子类的run方法");
}
}.start();
代码分析
第一步,调用Thread一参构造方法
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
执行 Initialize 方法
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
init(g, target, name, stackSize, null);
}
调用 Tread 中的初始化方法
private Runnable target;
init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc){
...
this.target = target;
...
}
此时完成带有 Runable 的匿名内部类对象参数的 Thread 类对象的初始化。
第二步,重写 Thread 中的 run() 方法(关键)
① 重写 Thread run() 方法,将其变为 Thread 匿名子类
被覆盖的 Thread run() 方法:
public void run() {
if (target != null) {
target.run();
}
}
此时的 target 即为如下的匿名内部类:
new Runnable() {
@Override
public void run() {
System.out.println("Runnable匿名子类的run方法");
}
}
重写后的:
@Override
public void run() {
System.out.println("Thread匿名子类的run方法");
}
② 调用 start() 方法
此时,整体为一个重写了 run() 方法的 Thread 的匿名子类。
调用 start() 方法后,由 JVM 调用该方法的 run() 方法,即被重写后的 run() 方法。
/**
* Causes this thread to begin execution; the Java Virtual Machine
* calls the <code>run</code> method of this thread.
*/