A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© linuxpara910829 中级黑马   /  2015-3-1 14:15  /  902 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package lingxingtest;
public class ThreadTest {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  new Thread(new Runnable(){
   //重写Runnable的run方法
   @Override
   public void run() {
    // TODO Auto-generated method stub
    for(int x=0;x<100;x++){
     System.out.println(Thread.currentThread().getName()+"Runnable...."+x);
    }
   }
  }){
   //重写Thread的run方法
   @Override
   public void run() {
    // TODO Auto-generated method stub
    for(int x=0;x<100;x++){
     System.out.println(Thread.currentThread().getName()+"Thread...."+x);
    }
   }
  }.start();
}
}
不明白为什么会运行Thread的run方法。
就是Thread的内部代码怎么写的   系统的看不懂  所以希望有高手给简化一下  让我知道调用的时候是怎么调用的

评分

参与人数 1黑马币 +2 收起 理由
万合天宜 + 2

查看全部评分

5 个回复

倒序浏览
哦   明白了    Thread实现了Runnable接口的run方法  也就是Thread重写了Runnable的run方法  我现在new的是子类对象  所以优先运行子类的run方法,子类如果没有run方法才会运行Runnable的run方法,所以会优先运行Thread的run方法
回复 使用道具 举报
本帖最后由 wdhm5423 于 2015-3-1 15:04 编辑
linuxpara910829 发表于 2015-3-1 14:20
哦   明白了    Thread实现了Runnable接口的run方法  也就是Thread重写了Runnable的run方法  我现在new的是 ...

你的说法还是错的,Thread实现Runnable,new Runnable是Runnable的子类对象,与Thread没有任何关系(没有实现关系),你要调用也是调用Runnable接口的run()方法,显然不是。重要的还是要看thread的start方法的执行步骤。
回复 使用道具 举报
本帖最后由 wdhm5423 于 2015-3-1 15:05 编辑

源代码中Thread的构造函数:
public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }
public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

在你的程序里,显然此时target!=null;
Thread里的run()方法:
public void run() {
        if (target != null) {
            target.run();
        }
    }
但是你已经对run()方法复写了,所以不会执行
if (target != null) {
            target.run();
        }
也就是target(new Runnable{})的run方法,而是执行复写的run()方法。
如果没复写Thread的run()方法,则会判断target != null,也就是判断是否传入Runnable的子类对象,如果有,执行该对象里的run()方法。这个才是正确的执行步骤。
回复 使用道具 举报 1 0
嗯  现在明白了    也就是我重写了run方法  就不会判断 target!=null  就是不会判断Runnable的子类  所以就会出就不会运行Runnable的子类的run方法


谢谢这位兄弟   给指了一个错  要不还不知道错到什么时候呢
回复 使用道具 举报 1 0
我以前也没怎么去找过源代码,就是看老师的视频跟着找。
解决了你的问题,我也有了独立找源代码的经验,互相学习进步!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马