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

来源:互联网 发布:常用sql查询语句 编辑:程序博客网 时间:2024/04/28 00:08

---------------------- 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.csdn.net/heima

原创粉丝点击