黑马程序员技术交流社区

标题: 一个关于线程的问题 [打印本页]

作者: linuxpara910829    时间: 2015-3-1 14:15
标题: 一个关于线程的问题
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的内部代码怎么写的   系统的看不懂  所以希望有高手给简化一下  让我知道调用的时候是怎么调用的

作者: linuxpara910829    时间: 2015-3-1 14:20
哦   明白了    Thread实现了Runnable接口的run方法  也就是Thread重写了Runnable的run方法  我现在new的是子类对象  所以优先运行子类的run方法,子类如果没有run方法才会运行Runnable的run方法,所以会优先运行Thread的run方法
作者: wdhm5423    时间: 2015-3-1 14:48
本帖最后由 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:00
本帖最后由 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()方法。这个才是正确的执行步骤。

作者: linuxpara910829    时间: 2015-3-1 15:32
嗯  现在明白了    也就是我重写了run方法  就不会判断 target!=null  就是不会判断Runnable的子类  所以就会出就不会运行Runnable的子类的run方法


谢谢这位兄弟   给指了一个错  要不还不知道错到什么时候呢
作者: wdhm5423    时间: 2015-3-2 11:10
我以前也没怎么去找过源代码,就是看老师的视频跟着找。
解决了你的问题,我也有了独立找源代码的经验,互相学习进步!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2