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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 实战造就实力 中级黑马   /  2014-1-4 18:52  /  1444 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 实战造就实力 于 2014-1-4 19:27 编辑

分析以下程序运行结果,说明原理。
public static void main(String[] args) {
                 MyThread t = new MyThread();
                t.run();
                t.start();
                System.out.println("A");

        }
          class MyThread extends Thread {
                public void run() {
                    try {
                        Thread.sleep(3000);
                        } catch (InterruptedException e) {
                     }
                    System.out.println("B");
                    }
}

请大师家解释一下这道题谢谢了

3 个回复

倒序浏览
你是不是将MyThread类的定义放到测试类中了.这样就成了成员内部类了.是不能你那样创建的.
要这样:
               MyThread t = new Test().new MyThread();
回复 使用道具 举报
汗,主函数没放到类里面去呢,加个类就能编译通过了
  1. class Demo
  2. {
  3.         public static void main(String[] args) {
  4.                  MyThread t = new MyThread();
  5.                 t.run();
  6.                 t.start();
  7.                 System.out.println("A");

  8.                 }
  9. }
  10. class MyThread extends Thread {
  11.          public void run() {
  12.             try {
  13.                   Thread.sleep(3000);
  14.                     }
  15.                         catch (InterruptedException e) {
  16.                      }
  17.              System.out.println("B");
  18.                     }
  19. }
复制代码
回复 使用道具 举报
从你主函数的流程开始说吧。
MyThread t = new MyThread();
这里 是你在堆内存开辟了一片内存空间,你的MyThread类型的变量 t 指向了这片内存空间。

t.run();
t 是 MyThread 类型的,会去内存找它这个类型是否有run方法。有。就去方法区中找到这个run方法。调用run方法的时候,还是主函数在执行,run方法中  有Thread.sleep(3000),sleep是Thread的静态方法,用于线程休眠。这个时候你的主函数中只有主函数线程一个在运行,所以休眠的是主线程。主线程休眠3秒,3秒后,接着执行run方法中的println打印语句。输出b
t.start();
因为MyThread是继承于Thread。这里直接调用继承与Thread的start方法。MyThread被当做线程启动,开始运行它重写的Thread的run方法中的代码。这个时候就有 主线程  和 MyThread线程两个线程在同时跑,抢CPU的执行权
注意 这里有两种情况:
当主线程抢到执行权的时候,和  当MyThread 线程抢到执行权的情况
当主线程抢到执行权,执行主线程的  println语句。打印输出 A。主线程结束,
                              MyThread线程再抢到执行权,然后休眠3秒,3秒后醒来,输出B
                               结果BAB
当MyThread线程抢到执行权:执行sleep,休眠3秒,线程在休眠的时候是会放弃执行权的。
                               MyThread放弃,那么主线程就抢到了,主线程执行,输出A,主线程结束
                               3秒后MyThread线程醒来,开始执行,输出B
                                结果BAB
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马