黑马程序员_QQ群讨论问题分析1

本文记录了在黑马程序员QQ群中关于Java线程创建的一个问题,探讨了当创建线程时同时定义匿名内部类实现Runnable接口并在同一线程中覆盖run()方法的情况。通过分析JDK源码,解释了为何只有覆盖的RUN2执行,而原始的RUN1未执行。文章总结了线程构造过程和方法调用机制。

---------------------- android培训java培训、期待与您交流! ----------------------

今天在黑马群里看到同学问的问题很有意思,我就想把它记在日记里,以后有机会再看看……

程序:

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("runnable");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}) {
public void run() {
while (true) {
System.out.println("thread");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();



简写:new Thread(new Runnable() {RUN1}) {RUN2;}.start();

RUN1和RUN2是两个public void run(){}

程序运行结果:RUN2执行,RUN1未执行

为什么呢?

我们从jdk源代码中查看Jdk-API\jdk源码\java\lang\Thread.java

找到相关代码

private Runnable target;

构造函数

public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
    }

构造函数调用

private void init(ThreadGroup g, Runnable target, String name, long stackSize) {*******this.target=target;*******}

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

总结:

//*******target就是new Runnable(){RUN1}实现了Runnable接口的实例对象

//*******new Thread(Runable实例){RUN2}——RUN2覆盖了new Thread(Runable实例)中的run方法,而这个run在Thread内部实质是调用Runnable接口实例对象的run方法



---------------------- android培训java培训、期待与您交流! ----------------------

 详细请查看:http://edu.youkuaiyun.com/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值