zoukankan      html  css  js  c++  java
  • 为什么说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方法,

  • 相关阅读:
    qbzt day6 上午
    qbzt day5 下午
    qbzt day5 上午
    【7.24校内交流赛】T3【qbxt】复读警告
    【7.24校内交流赛】T1&T2
    一个一定要好好提溜出来的贪心题
    7.19 讲题
    DP大大大大大赏
    图论经典例题大赏
    数据结构题大赏
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13217054.html
Copyright © 2011-2022 走看看