Runnable的run方法和Thread的run方法一起运行结果如何?

示例代码:

public class TestMain {
    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是Runnable的run方法");
            }
        }) {
            @Override
            public void run() {
                System.out.println("我是Thread的run方法");
            }
        };
        thread.start();
    }
}

运行结果:
在这里插入图片描述
可以看到结果是只运行了Thread类重写的run方法。

原因分析

Thread类的start()方法最后调用到的是一个native方法。如果打开open jdk看源码的话可以发现,最后这个start()方法会调用到run()方法,所以实际上的运行逻辑还是靠run方法里的代码。

看看Thread类中的run()方法源码:

public class Thread implements Runnable {
//Runnable对象
private Runnable target;

 @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
  }

可以发现Thread类重写了Runnable接口的run()方法,但是最后调用的其实还是Runnable里的run方法。

而在示例代码中,我又重写了Thread类的run()方法,这样的话,Thread类的run()方法中的逻辑就变成我重写的逻辑了,和run()方法源码完全不一样了,自然也就不会有target.run()这段逻辑了。

总结

如果是通过继承Thread类来创建线程,那start()方法最后调用的就是被重写的run方法里的逻辑。如果是通过实现Runnable接口来创建线程,那么start()方法就会先调用Thread类的run()方法,然后Thread类的run()方法会再调用Runnable接口里被重写的run()方法。

发布了202 篇原创文章 · 获赞 203 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104472484