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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张立江 于 2012-7-21 21:34 编辑
  1. class MyThread extends Thread{
  2.         public void run(){
  3.                 try {
  4.                         Thread./*currentThread().*/sleep(3000);
  5.                 } catch (InterruptedException e) {
  6.                 }
  7.                 System.out.println("MyThread running");
  8.         }
  9. }



  10. public class ThreadTest{
  11.         public static void main(String argv[]) {
  12.                 MyThread t = new MyThread();
  13.                 t.run();
  14.                 /*
  15.                 1.调用了run()方法,并未开启线程,所以sleep3000毫秒之后并没有释放线程执行权,3000毫秒之后醒来,
  16.                 继续执行打印语句.输出MyThread running.之后 该语句执行完毕.
  17.                 */
  18.                 t.start();
  19.                 /* 2.调用了start()方法,开启线程,于是sleep 3000毫秒,并释放了线程执行权.
  20.                 */4.3000毫秒之后,线程醒来,执行打印语句 MyThread running
  21.                 System.out.println("Thread Test");
  22.                 /*
  23.                 3.因为t.run()已经执行完毕,所以是打印语句抢到了执行权,
  24.                 于是输出Thread Test.之后语该语句执行完毕.
  25.                 */
  26.           }

  27. }
复制代码
请大家写出分析过程

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 王达 于 2012-7-3 08:46 编辑

在主线程运行到r.run()的时候,是调用MyThread 的run方法,因为currentThread是返回正在执行当前线程对象的引用,而直接用对象调用run方法并未开启线程,所以不会sleep直接运行"MyThread running",到r.start时候会开启一个新的线程,但他会放弃执行资格等待3秒,主线程打印完“Thread Test”后,3秒后新线程才会打印他的"MyThread running"。所以运行结果是:MyThread running   Thread Test    MyThread running这样顺序的三个。
回复 使用道具 举报
将你的代码加一条输出语句。如下:
public class ThreadTest{
    public static void main(String argv[]) {
            MyThread t = new MyThread();
            System.out.println("try");//为了检验,新增的语句
            t.run();
            t.start();
            System.out.println("Thread Test");
      }
}
你再运行看看就知道了,首先输出try,然后由于 t.run();调用了run()的方法,会延时3秒钟再显示MyThread running,注意此时并未开启线程,只是调用了run方法。紧接着瞬间输出了Thread Test。不用解释。再过3秒钟,又会输出MyThread running,这次是开启了线程并start()方法会自动调用run()方法。所以改后的程序输出如下:
try
MyThread running//(在上行输出后3秒),未开启线程
Thread Test//(紧接着上行输出)
MyThread running//(在上行输出后3秒),已开启线程
最后总结:
run()只是调用函数,不开启线程。
start()开启线程,并调用函数run()。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一步 执行到 t.run();的时候调用run方法,在run方法主线程休息三秒钟后执行  System.out.println("MyThread running");
第二步 开启线程t  这时候有两个线程在运行, t运行run方法时休息三秒 所以通常主线程中的System.out.println("Thread Test");会先执行。
第三步 t线程开启三秒后执行t线程中的  System.out.println("MyThread running");
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马