首先我们先介绍:
两种方法是什么:
方法一:
1.创建一个类,继承Thread类
2.在此类中重写run方法
3.创建类的对象
4.调用start方法(1.启动线程,2.调用run方法)
刨析:
Thread中的run方法实际上是实现Runnable接口的方法,所以,创建好类的对象,我们执行了父类的start方法,而这个方法又调用自己run方法,此时run‘方法就是子类的了。
方法二:
1.创建一个实现类的对象实现Runnable接口,并实现run方法
2.创建Thread类的对象,将Runnable的实现类的对象作为参数传给Thread类的对象
3.使用Thread调用start方法(不同于方法一,虽然对象种类不同,但是方法是一个方法)
刨析:
此时就直接绕过Thread类,直接实现了Runnable接口,重写了run方法,将这个实现类的对象作为参数传递给Thread类的时候,Thread类完成了Runnable target这个属性的赋值,start方法调用自己的run方法(target.run),执行是实现类的方法(也就是接口的多态性)
称之为代理模式
总结:
实际上,本质是使用的是一个start方法,无论重写谁的run方法,最终都会执行到你重写的run方法(这不废话),方法一是一个虚方法调用,执行到run,方法二是一个接口的多态性,执行到run。