Thread匿名子类题目源码分析

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.
     */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值