为什么说JAVA中runnable接口的run方法运行在子线程?

分析下面代码:

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方法

原因如下:

1. 首先,我们创建了一个Thread的匿名内部类对象

2. 该匿名Thread子类对象接收一个Ruannable接口子类的匿名内部类对象

3. 在Thread子类的匿名内部类定义中,我们覆盖了父类(Thread)的run方法

4. 接着我们在Thread的匿名内部类对象上调用了start()方法,启动该Thread匿名内部类对象所表示的子线程

5. 在该子线程(即Thread的匿名内部类对象)上调用start()方法,start()方法会调用Thread类的run()方法,但这个run方法在Thread的匿名子类定义中被子类覆盖了。所以实际在子线程中执行并非是Thread类的run()方法,而是Thread的匿名子类中定义的run()方法(即多态效果)

解释2:

New Runnable的匿名子类对象传到Thread的构造方法中,赋值给了target引用变量,而targe引用变量最后又构成了Thread类中的Run方法,而Thread的匿名内部类对象,即Thread的子类重写了父类Thread的Run方法,实现了覆盖,所以就不会输出Runnale匿名子类的run方法,