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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宗士为 中级黑马   /  2012-5-19 10:25  /  1801 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class MyThread extends Thread{
       publicvoid run(){
              try{
                     Thread.currentThread().sleep(3000);
              }catch (InterruptedException e) {
              }
              System.out.println("MyThreadrunning");
       }
}
public class ThreadTest{
       publicstatic void main(String argv[]) {
              MyThreadt = new MyThread();
              t.run();
              t.start();
              System.out.println("ThreadTest");
         }
}
我自己考虑
打印结果 Thread Test   MyThread running   
因为t.run()是调用方法不是线程 线程不开始 不打印
       t.start()开始线程后线程休眠3000毫秒
所以先打印Thread Test 线程休眠时间到后打印MyThread running


但是运行了下
结果是MyThread running    Thread Test     MyThread running  
就是一直想不明白中间到底是怎么实现的
为什么会这样呢   

求高手指点
为黑马努力
不知道到底有多少人报名通过了


评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览
看看你的分析,其实也可以推断出答案的,亲
因为t.run()是调用方法不是线程 线程不开始 不打印     main线程调用此方法  sleep3秒  还未执行到下面的代码  所以打印MyThread running   
       t.start()开始线程后线程休眠3000毫秒          main线程执行此代码,开启了线程1  main线程继续向下走,线程1执行自己的代码,sleep3秒  这时main线程执行到了
                                                   最后一句代码  打印Thread Test    线程1 睡醒了  输出 MyThread running
回复 使用道具 举报

class MyThread extends Thread{
       publicvoid run(){
              try{
                     Thread.currentThread().sleep(3000);
              }catch (InterruptedException e) {
              }
              System.out.println("MyThreadrunning");
       }
}
public class ThreadTest{
       publicstatic void main(String argv[]) {
              MyThreadt = new MyThread();
              t.run();//         这里线程MyThead未启动,主线程运行到这里时,把t视作一个对象,调用了run()方法,因为只有一个主线程,所    以try{}中内容不影响执行结果,打印为MyThread running
              t.start();//这里线程t启动,但是主线程还未执行完,所以它还没有执行权
              System.out.println("ThreadTest");//主线执行完这句,打印ThreadTest,然后线程t抢到执行权,执行结果也自然为MyThread running。
         }
}
所以最终该程序结果MyThread running    Thread Test     MyThread running
回复 使用道具 举报
本帖最后由 赵玮_Tom 于 2012-5-19 11:15 编辑

过程如下:
主线程执行到run()方法时,并不开启线程,和其他一般的调用方法是一样的。这时,主线程
会去run()方法中执行代码,在主线程睡眠期间,还没有执行到start(),所以没有开启其他
线程,主线程执行完run()方法,打印一次My Thread running。这时,执行到start(),开启新
线程,新线程要睡眠,主线程先执行完,会打印Thread Test,然后新开启
的这个线程执行完,打印My Thread running(正是你的结果)。
回复 使用道具 举报
贠(yun)靖 发表于 2012-5-19 10:45
看看你的分析,其实也可以推断出答案的,亲
因为t.run()是调用方法不是线程 线程不开始 不打印     main线 ...

斑竹   其实 这句“ 因为t.run()是调用方法不是线程 线程不开始 不打印“ 是我猜我的   就是不明白中间的过程所以才发问   或许的大家也有我相同的问题   咱没基础就只能把原理弄明白弄清楚了和本专业的比起来才会有点优势  请理解  
回复 使用道具 举报
宗士为 发表于 2012-5-19 11:20
斑竹   其实 这句“ 因为t.run()是调用方法不是线程 线程不开始 不打印“ 是我猜我的   就是不明白中间的 ...

main是一个线程 对吧   在main方法中执行到t.run()方法的时候  main线程就转到  该方法内部去执行了
  也就是说  执行run里面的代码  这时候还是只有main线程这一个线程
   当读到sleep的时候  main线程是不是就休息3秒了?   这个run方法中的代码执行完后main方法才开始执行
t.run() 这几句话下面的代码   也就是t.start() 这句话  这时候 又开启了一个线程
  这时候内存中就有两个线程了  一个是main线程  一个是刚刚开启的线程  
  main线程继续执行接下来的代码   而新开启的线程会执行run里面的方法  当新开启的
  的这个线程执行到sleep的时候 还是要休息3秒的  而此时main线程已经直线了最后一句代码了
    这样你要还看不懂  我就没辙了~~
回复 使用道具 举报
贠(yun)靖 发表于 2012-5-19 11:59
main是一个线程 对吧   在main方法中执行到t.run()方法的时候  main线程就转到  该方法内部去执行了
   ...

这个很透彻   谢谢斑竹
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马