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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖勇 中级黑马   /  2013-10-8 16:24  /  2913 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class ThreadTest {

  2.         public static void main(String args[]) {

  3.         MyThread t = new MyThread();

  4.         t.run();

  5.         t.start();

  6.         System.out.println("A");

  7.         }

  8.     }



  9.     class MyThread extends Thread {

  10.         public void run() {

  11.             try {

  12.                 Thread.sleep(3000);

  13.                 } catch (InterruptedException e) {

  14.              }

  15.             System.out.println("B");

  16.             }

  17.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

11 个回复

倒序浏览
结果为什么是BAB?
请详细解释下!
回复 使用道具 举报
个人解释:首先main函数下 MyThread t = new MyThread();---你创建了一个新对象,这是线程1.然后当你执行t.run();时,程序执行run()这个线程,出现B。然后执行 t.start();时,程序开启一个新线程,执行class MyThread extends Thread 中的run(),结果是 AB。所以最终是BAB。个人见解!希望大家一起讨论   
               

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 murder_fol 于 2013-10-8 16:49 编辑

MyThread  t = new  MyThread(); //创建子线程对象
t.run();//这个时候子线程并没有启动,还是在主线程中执行t对象的run方法,在run方法中有Thread.sleep(3000) 是主线程休眠了3秒,然后打印b。然后继续执行主线程的下个语句(t.start())。
t.start();//  子线程启动,并开始执行run方法,这时候Thread.sleep(),子线程休眠,然后主线程就抢到cpu,然后执行主线程的下个语句,打印a,打印完后,主线程结束。当子线程休眠结束,就开始继续执行run方法中没有执行完的语句打印b。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
        MyThread t = new MyThread();

        t.run();

创建对象,调用run()方法 打印A。
t.start();线程开启。跟主线程抢夺CPU,但是你让开启的线程睡了一下。
System.out.println("A");

新开启的线程睡了一下,肯定抢不过主线程。
然后打印出A,
主线程运行完毕后,接着运行创建的线程。打印出B。

如果不让线程睡觉的话,有可能会出现BBA的情况。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
在那个地方我不是让线程睡了3秒吗,但是打印的时候结果是先出来BA,然后睡了三秒才出来B,这就使我感到奇怪,要是像你们那样解释的话,先出来B,然后睡三秒,在出来A,再睡三秒出来B,但是打印结果不是这样的,是先出来BA,再出来B。
回复 使用道具 举报
本帖最后由 winsking 于 2013-10-8 19:51 编辑

1.主线程先执行,执行到 t.run();,调用run方法,打印B
2.接着主线程执行到t.start();,开启一个线程执行run方法,但是sleep了,这时主线程继续执行下面,打印A
3.开启的线程sleep结束,继续执行,打印出B

记住,主线程开启线程后并不停止执行下面的代码,而是继续向下执行,除非遇到t.join()方法,这时候主线程就会等待,等新建线程执行 完,主线程才会执行。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
在解决这个问题的时候,你要明白new Thread().run()和new Thread().start()的区别:


如果线程直接调用run()方法和调用普通方法是一样的,
只有当遇到了start()方法才会开启一个线程和主线程抢夺CPU,


所以对于您的程序,会执行到你的start()方法,才会开启线程,所以肯定会先输出B,
执行到start()后,开启线程和主线程抢CPU,那就看谁抢的快了。
当不是不线程抢到了,那么就输出B,否则就是执行System.out.println(A);


所以结果可能是BBA,也可能是BAB


希望对你有帮助!
回复 使用道具 举报
To 金牌黑马 2013-10-9 08:43:15
9#
如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
肖勇 发表于 2013-10-8 19:27
在那个地方我不是让线程睡了3秒吗,但是打印的时候结果是先出来BA,然后睡了三秒才出来B,这就使我感到奇怪, ...

不是啊 是主线程先睡3秒 然后打印b,然后子线程睡着了,主线程马上执行,马上打印a啊,所以是ba先打印,主线程结束了,子线程三秒后醒了,打印b
回复 使用道具 举报
线程是使用start方法来启动的线程,run的话是直接填用方法,并没有启动线程,按照顺序结构的话。首先主线程执行到这句话  t.run();的时候 主线程进到run方法里,先睡了3000秒,打印B后,主线程返回执行这句话
t.start(); 启动线程输出B 主线程在向下执行
回复 使用道具 举报
To 金牌黑马 2013-10-10 10:46:59
12#

楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马