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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 手心里的温柔 于 2013-8-2 14:02 编辑
  1. class Demo extends Thread
  2. {
  3.         Demo(String name)
  4.         {
  5.                 super(name);
  6.         }
  7.         public void run()
  8.         {
  9.                 for(int x=0;x<200;x++)
  10.                         System.out.println(Thread.currentThread()+" run"+x);
  11.         }
  12. }
  13. class Test
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Demo d1 = new Demo("one");
  18.                 Demo d2 = new Demo("two");

  19.                 d1.start();  
  20.                
  21. //               for(int x=0;x<300;x++)
  22. //                           System.out.println(Thread.currentThread()+"main run"+x);</font>

  23.                     d2.start();        
  24.         }
  25. }
复制代码
上边代码中,运行结果 d1,d2线程交替打印加上注释的那两行,运行结果 d1与main线程交替打印 结束后,d2才开始打印
搞不明白什么原因,换成较大数据也试过

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

8 个回复

倒序浏览
当然拉..CPU执行速度很快的.. 你把D2这条线程放在了Main的后面了 所以D1线程开启后 然后就进行到循环了,等他们都循环结束了.. 自然就回来看D2开启线程了

评分

参与人数 1黑马币 +4 收起 理由
田磊阳 + 4

查看全部评分

回复 使用道具 举报
本帖最后由 の放下执著 于 2013-8-1 06:33 编辑

很明显,你的d2.start();放在了for循环后,意思是说要等for循环打印完了才开启线程2,,所以当然是:运行结果 d1与main线程交替打印 结束后,d2才开始打印。

下面就拿主函数main内的代码分析吧:
public static void main(String[] args)
        {
                Demo d1 = new Demo("one");//创建线程d1
                Demo d2 = new Demo("two");//创建线程d2
                /*注意了,上面的两条语句仅仅是创建了线程,仅此而已。
                    线程的真正开启,是在调用了start()方法之后*/
                d1.start();  //线程d1开启
         
                /*当线程main执行完下面的for()循环后线程d2才开启,代码的执行顺序是从上到下的*/
//               for(int x=0;x<300;x++)
//                           System.out.println(Thread.currentThread()+"main run"+x);</font>

                    d2.start();  //线程d2才开启,这时候线程main里面的输出语句早打印完了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报 1 0
你的d2.start();放在了for循环后,意思是说要等for循环打印完了才开启线程2,,所以当然是:运行结果 d1与main线程交替打印 结束后,d2才开始打印。

回复 使用道具 举报
三楼说的比较对,因为你最好才开启的   d2.start();  如果想要实现d1,d2线程交替打印加上注释的那两行,需要同步一下 ,用到synchronzied(),不过多线程 一般都是实现Rannable来完成的,继承Thread有单继承的局限性
回复 使用道具 举报
の放下执著 发表于 2013-8-1 06:30
很明显,你的d2.start();放在了for循环后,意思是说要等for循环打印完了才开启线程2,,所以当然是:运行结 ...

多谢,明白了:handshake
回复 使用道具 举报
张云杰 发表于 2013-8-1 05:08
当然拉..CPU执行速度很快的.. 你把D2这条线程放在了Main的后面了 所以D1线程开启后 然后就进行到循环了,等 ...

谢谢,明白了
回复 使用道具 举报
xwf4348 发表于 2013-8-1 09:21
你的d2.start();放在了for循环后,意思是说要等for循环打印完了才开启线程2,,所以当然是:运行结果 d1与ma ...

多谢 明白了
回复 使用道具 举报
nihaoligong 发表于 2013-8-1 10:06
三楼说的比较对,因为你最好才开启的   d2.start();  如果想要实现d1,d2线程交替打印加上注释的那两行,需 ...

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