一个线程执行的问题

浪漫小和 2013-06-27 06:07:18
new Thread(
new Runnable(){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runnable :" + Thread.currentThread().getName());

}
}
}
){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread :" + Thread.currentThread().getName());

}
}
}.start();


在这个程序里面,为什么执行的是 "thread" 这个,而不是"runnable " 的?
...全文
145 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
北京-李大鹏 2013-06-28
  • 打赏
  • 举报
回复
new Thread(...){
    public void run() {
        ...
    }
}.start();
这个代码结构是创建了一个匿名的Thread子类,并且覆盖了run()方法。 你的 runnable 是做为参数传入的,在Thread.run()方法里执行的,因为你覆盖了run()方法,所以根本就没有执行你的 runnable 。
浪漫小和 2013-06-28
  • 打赏
  • 举报
回复
还是没明白!!!
pangjingji 2013-06-28
  • 打赏
  • 举报
回复
5楼 --》正解
byourfan 2013-06-27
  • 打赏
  • 举报
回复
去Thread源代码里面看,start内部调用Thread类的run()方法,而run方法是这么写的:

public void run() {
    if (target != null) {
        target.run();
    }
}
在这里target是构造时传进去的Runnable。这个run方法被重写的话,这段代码也就不会执行,不会调用target.run()
xiars123 2013-06-27
  • 打赏
  • 举报
回复
"runnable"的run()是实例化的时候实现的构造方法; "thread"的run()是重写的,所以执行出来是"thread" 如果你修改一下后面一个方法为: public void run() { super.run(); } 可以发现执行的是构造方法里的run()。
Gqc_jar 2013-06-27
  • 打赏
  • 举报
回复
我也刚学到线程,本来想看看,一看到这代码。。。还是去别的地方看看去了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧