new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable-->run");
}
}) {
@Override
public void run() {
System.out.println("Thread-->run");
}
}.start();
先解释一下这个代码,可能有的同学已经忘了匿名内部类的使用和创建!
创建一个Thread的子类对象并重写Thread的run()方法,通过Thread的子类对象的构造方法传递一个Runnable接口的实现类对象并重写Runnable接口的run()方法!
输出结果是: Thread-->run
为什么执行的是Thread子类的run(),难道不应该是Runnable接口实现类对象的run()吗?
接下来看Thread的源码
public void run() {
if (target != null) {
target.run();
}
}
target哪来的呢,其实就是Thread的构造方法传递的Runnable接口的实现类对象,源码意思说如果传递的实现类对象不为空则调用实现类对象的run方法,那么为什么结果调用的却是Thread子类对象的run(),那是因为源码中有判断是否为空,不为空调用Runnable的run(),结果我们的代码是重写了Thread的run方法,所以执行的结果就是Thread的run方法!
接下来有个问题,如果是以下代码,执行的结果会是什么呢???
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable-->run");
}
}) {
@Override
public void run() {
super.run();
System.out.println("Thread-->run");
}
}.start();
有了对第一个案例的理解,这个就比较好理解了!
重写Thread的run()方法,并在第一行调用了父类的run();父类的run()是执行了Thread()的构造中传递过来的Runnable接口的实现类对象的run方法,所以先执行Runnable的run(),然后执行System.out.println("Thread-->run");
结果就是:
Runnable-->run
Thread-->run
|
|