问题:如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,那么,线程运行时的执行代码是子类的run方法的代码?还是Runnable对象的run方法的代码?
示例代码:
public class TraditionalThread {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
System.out.println("runnable :" + Thread.currentThread().getName());
}
};
Thread thread = new Thread(runnable) {
public void run() {
System.out.println("thread :" + Thread.currentThread().getName());
}
};
thread.start();
}
}
运行结果:
解释:
当我们调用thread.start()方法时,虚拟机会自动去调用其run()方法。而当run()方法被覆盖时会调用我们重写的方法,便调用不到runnable .run()方法。这点我们可以从Thread类的源代码中看到。
thread.start()方法的说明
thread.run()方法的说明
其中的target就是我们传进去的runnable对象。