打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java来看一道多线程面试题

问题:下面线程开启后会执行哪一句话会输出到控制台?
答:你好Thread 会被打印

public static void main(String[] args) {        Runnable runnable = new Runnable() {            @Override            public void run() {                System.out.println("你好Runable");            }        };        new Thread(runnable) {            @Override            public void run() {                System.out.println("你好Thread");            }        }.start();    }

解读

Runnable runnable = new Runnable() {            @Override            public void run() {                System.out.println("你好Runable");            }        };

上面的代码使用了匿名内部类的方式实现了Runnable接口,并用父类引用指向子类对象------多态。总之表示创建了Runnable接口实现类对象runnable。

new Thread(runnable)

使用有参构造创建Thread对象,也采用了匿名内部类实现。

 new Thread(runnable) {            @Override            public void run() {                System.out.println("你好Thread");            }        }.start();

这里表示匿名类的子类,因为有大括号重写,就表示子类。最终要的就是后面的start方法了。线程对象调用start对象后,操作系统(start方法底层调用了c语言我们暂时是看不到源码)会为我们调用线程的run方法,我们来看有参构造的执行流程。


我们发现最后Runnable接口实现类对象传递给了Thread的成员变量,我们现在再来看看操作系统为我们调用的run方法。

如果刚刚传递过去的Runnable接口实现类对象不为空,那么执行它的run();方法。以上就是有参Thread构造方法和start方法执行流程。
再回到面试题

 new Thread(runnable) {            @Override            public void run() {                System.out.println("你好Thread");            }        }.start();

我们发现Thread类中的run方法已经被重写,所以即使传递了runnable,也没有用,最后开启线程,执行了System.out.println(“你好Thread”);
思考
那么如何执行runnable里面的代码呢?手动执行就行了呗

new Thread(runnable) {            @Override            public void run() {                runnable.run();                System.out.println("你好Thread");            }        }.start();

或者我们调用一下父类有参构造里面的run方法也可以

new Thread(runnable) {            @Override            public void run() {                super.run();                System.out.println("你好Thread");            }        }.start();

运行结果

你好Runable你好Thread
来源:https://www.icode9.com/content-1-867251.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java并发多线程编程——Volatile原理与使用
4种方式,实现多线程按着指定顺序执行
一道关于java线程的面试题
Java中多线程使用匿名内部类的方式进行创建3种方式
Java基础巩固之线程学习
Java实现定时任务的三种方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服