public class Test extends Thread {
public void run() {
try{
Thread.currentThread().sleep(3000);
}catch(Exception e){}

System.out.println("MyThread running");
} public static void main(String[] args) { Test p = new Test();
p.run();
p.start();
System.out.println("test");
}
}请给出执行结果并分析过程。
这题很困惑啊。

解决方案 »

  1.   

    主线程睡3秒,打印MyThread running,然后启动线程Test
      

  2.   

    你的意思是打印一个MyThread running,还是打印两个?
      

  3.   

    两个,run方法调用了2次,你自己跑下程序不就知道了,晕。
      

  4.   

    p.run();并没有启动线程,只是普通的方法调用,当前线程为主线程,
    所以主线程睡3秒后打印MyThread running,主线程继续执行p.start();启动新线程,调用run方法再次睡3秒,然后打印MyThread running,因为新线程睡了3秒,所以在新线程睡觉的时候主线程会继续执行打印test,也就是说test先于第2个MyThread running打印
      

  5.   

    执行结果:
    MyThread running
    test
    MyThread running
    分析:p.run 输出一句话
    接下来输出test,然后3秒后再输出
    有什么问题么?
      

  6.   

    明白点了,我概念不是很强,p.run()并不是启动一个线程,我一直以为是启动一个线程呢。
      

  7.   


            p.run();
            p.start();
            System.out.println("test");p.run(): 这就是在main方法的线程里执行的,并未开启新线程,所以,在p.run()执行完之前,将导致阻塞;
    p.start(): 启动了一新线程,启动完成之后,就跑下去执行System.out.println("test");
    所以,程序的执行结果是:
    MyThread running
    test
    MyThread running
      

  8.   

    呵呵,没什么大问题,不过我觉得你这分析挺有意思的,基本等同于:
    分析:
    先打印MyThread running
    再打印test
    最后打印MyThread running
      

  9.   

    哈哈,你等着要分是吧,我以前线程学的还挺好,现在把大量时间用在SSH框架上了,J2SE拉下很多,这道题是我今天的笔试题,回来一运行发现自己做错了,挺郁闷的,50分小意思,但笔试答错了,真的挺郁闷。