public class DeadLock {
public static void main(String[] args){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable-->run");
}
}) {
@Override
public void run() {
System.out.println("Thread-->run");
}
}.start();
}
}
输出:Thread-->run
这是为什么呢?
答案就在JDK源码中:
@Override
public void run() {
if (target != null) {
target.run();
}
}
其中的target就是Runnable对象。
如果存在target就执行target的run方法。那结果应该是Runnable-->run,为什么是Thread-->run呢,你别忘记这个方法被覆盖了!被Thread的run覆盖掉了。
下面这段代码的输出又是什么呢?
public class DeadLock {
public static void main(String[] args){
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();
}
}
输出:Runnable-->run
Thread-->run
因为多了一句话:super.run();父类的run方法执行了,父类的run方法就是
@Override
public void run() {
if (target != null) {
target.run();
}
}
所以父类的run方法先执行再执行子类的run方法。
PS:创建的new Thread(..)就是一个子类,这点容易忘记。
转自:https://blog.csdn.net/yssjz960427031/article/details/52303155