Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

1.2.7 public Thread(Runnable target)中的target参数

当使用如下代码时:


MyRunnable run = new MyRunnable();
Thread t = new Thread(run);
t.start();

JVM直接调用的是Thread.java类中的run()方法。该方法源代码如下:


@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

在方法中判断target变量是否为null,不为null则执行target对象的run()方法。target存储的对象就是前面声明的MyRunnable run对象,对Thread构造方法传入Runnable对象,再结合if判断就可以执行Runnable对象的run()方法了。变量target是在init()方法中进行赋值初始化的,核心源代码如下:


private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize, AccessControlContext acc,
                  boolean inheritThreadLocals) {
    ……
    this.target = target;
    ……

而方法init()是在Thread.java构造方法中被调用的,源代码如下:


public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}

当执行start()方法时,由JVM调用Thread.java类的run()方法:


@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

然后Thread.java类的run()方法再调用target的run()方法。这里if条件语句的结果为true,所以执行target对象的run()方法。

使用如下代码:


public class Test2 {
public static void main(String[] args) throws InterruptedException {
        Thread myThread = new Thread() {
            @Override
            public void run() {
                System.out.println("运行run!");
            }
        };
        myThread.start();
    }
}

内部会创建Thread类的子类Test2$1.class,反编译后的源代码如下:


package test;

import java.io.PrintStream;

class Test2$1
extends Thread
{
public void run()
    {
        System.out.println("运行run!");
    }
}

子类Test2$1.class重写了Thread.java类的run()方法,如果不调用“super.run();”,则不会执行Thread.java类的run()方法,而是直接执行Test2$1.class类的run()方法。