上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()方法。