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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨博 中级黑马   /  2013-3-18 20:35  /  1444 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨博 于 2013-3-18 20:58 编辑
  1. class ThreadDemo1 {

  2. public static void main(String[] args) {
  3. MyThread mt = new MyThread(); // 4.创建线程对象

  4. mt.start(); // 5.开启新线程, 内部会自动执行run方法
  5. /*
  6. try
  7. {
  8. mt.sleep(1000);
  9. }
  10. catch (Exception e)
  11. {
  12. e.printStackTrace();
  13. }
  14. */
  15. for (int i = 0; i < 100; i++)
  16. System.out.print("A ");
  17. }

  18. }

  19. class MyThread extends Thread { // 1.定义类继承Thread
  20. public void run() { // 2.重写run方法

  21. for (int i = 0; i < 100; i++) // 3.把新线程要做的事写在run方法中
  22. System.out.print("B ");
  23. }
  24. }
复制代码
求大神指导:为什么到mt.start(); 这句时,有了新线程,按理应该开启新线程, 内部会自动执行run方法,那么会先运行重写的run(),先打印B,然后可能B和A交叉打印,但是,每次打印都会已A开始打印,另外,如果像代码中那样,在mt.start()后加睡眠1秒,却会先打印主线程的A,试过很多次,都是上面的情况,麻烦大神解答,谢谢

点评

如果I的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问。谢谢  发表于 2013-3-18 21:01

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

4 个回复

倒序浏览
我也遇到了同样的问题,不过我自己的理解,似乎主函数的进程和新进程理论上是一起加载,但是,新进程加载短暂的时间,主函数就输出了A,除非主函数加延迟,才能使得主函数那个A后打印,这是我自己测试总结的 ,不知道对不对,求大神指点。
回复 使用道具 举报
本帖最后由 张洪慊 于 2013-3-18 20:56 编辑

1.当mt.start();后,线程开启->此时线程处于就绪状态,并不一定立即调用run方法执行
  主线程和mt处于同等地位,cpu执行谁那是不确定的

2.如果你加上sleep后,让主线程等待1s->cpu会切换至mt线程执行->BBB....

3.如果你把循环次数设置足够大它可能出现打印一部分B(A),在打印一部分A(B),在打印一部分(B)A......
回复 使用道具 举报
张洪慊 发表于 2013-3-18 20:53
1.当mt.start();后,线程开启->此时线程处于就绪状态,并不一定立即调用run方法执行
  主线程和mt处于同等地 ...

嗯,了解了,谢谢
回复 使用道具 举报
线程是谁拥有执行权谁执行,究竟执行权在谁手中,由CPU觉得
mt.start();是开启了一个新的线程,但是它不一定拥有cpu执行权,main函数拿到cpu依然可以继续执行。
  1. mt.start();
  2. try
  3. {
  4. mt.sleep(1000);//让mt线程等待,那么main方法会继续执行
  5. }
  6. catch (Exception e)
  7. {
  8. e.printStackTrace();
  9. }
  10. for (int i = 0; i < 100; i++)//实际是因为CPU很快就执行完了
  11. System.out.print("A ");
  12. }
复制代码
如果你想看到不用sleep还能交替打印的效果,可以把循环次数改大点,比如1000

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马