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

  • 相关阅读:
    elasticsearch索引的增删改查入门
    windows下mongodb安装与使用
    在SqlServer中使用Try Catch(转)
    sqlserver 存储过程 try catch TRANSACTION (转)
    SQLserver2008如何把表格变量传递到存储过程中
    SQL对字符串数组的处理
    SQLSERVER数据库表各种同步技术
    函数参数
    闭包
    枚举
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13217054.html
Copyright © 2011-2022 走看看