• 为什么说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方法,

  • 相关阅读:
    ExtJs之Grid
    [java]转:String Date Calendar之间的转换
    SQL Server脚本备份
    Java实现文件夹的复制(包括子文件夹与文件)
    Android webview使用详解
    zxing条码扫描横屏修改
    Genymotion的安装与eclipse配置教程
    开发中遇到的问题
    sql中COUNT()+GROUP BY +HAVING的组合使用
    由于包名与引用的库名相同导致的报错
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13217054.html
Copyright © 2020-2023  润新知