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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大大老伴要跪IT 中级黑马   /  2014-1-23 20:49  /  1318 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大大老伴要跪IT 于 2014-2-14 22:54 编辑

分析以下程序运行结果,说明原理。

    public class ThreadTest {
        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 个回复

倒序浏览
目测是入学面试题。你可以想一想run()方法和start()方法的区别。结果:BAB。t.run()只是调用函数。所以输出B。
t.start()是开启一个MyThread线程,让线程处于就绪状态,当执行到线程体时候,休眠了3秒。在此期间主线程抢到了CPU执行权,所以主线程输出A,主线程执行完后,MyThread线程苏醒,输出了B。
回复 使用道具 举报
输出结果是 B A B ,t.run()是调用普通方法,这时是在主线程中运行,因此要等到t.run运行完再继续执行下面的代码,因此先输出B,当执行t.start时启动了一个新线程,主方法继续向下执行 输出A 接着子线程输出B
回复 使用道具 举报
楼主你好,
  1. public class ThreadTest {
  2.     public static void main(String args[]) {
  3.     MyThread t = new MyThread();
  4.     t.run();//此处主线程休眠3s,并输出B,此处运行时,MyThread线程还没有被开启
  5.     t.start();//开启MyThread线程,轮到该线程运行时,该线程进入冻结状态3s,休眠期间其他线程运行
  6.     //休眠结束后,再次轮到该线程运行时,输出B
  7.     System.out.println("A");//主线程输出A
  8.     }
  9. }

  10. class MyThread extends Thread {
  11.     public void run() {
  12.         try {
  13.             Thread.sleep(3000);
  14.             } catch (InterruptedException e) {
  15.          }
  16.         System.out.println("B");
  17.         }
  18. }
复制代码

说的不对的,欢迎指正!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马