黑马程序员技术交流社区

标题: 多线程中碰到的一个现象,求大神解释 [打印本页]

作者: 手心里的温柔    时间: 2013-8-1 04:29
标题: 多线程中碰到的一个现象,求大神解释
本帖最后由 手心里的温柔 于 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才开始打印
搞不明白什么原因,换成较大数据也试过


作者: 张云杰    时间: 2013-8-1 05:08
当然拉..CPU执行速度很快的.. 你把D2这条线程放在了Main的后面了 所以D1线程开启后 然后就进行到循环了,等他们都循环结束了.. 自然就回来看D2开启线程了
作者: の放下执著    时间: 2013-8-1 06:30
本帖最后由 の放下执著 于 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里面的输出语句早打印完了

作者: xwf4348    时间: 2013-8-1 09:21
你的d2.start();放在了for循环后,意思是说要等for循环打印完了才开启线程2,,所以当然是:运行结果 d1与main线程交替打印 结束后,d2才开始打印。


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

多谢,明白了:handshake
作者: 手心里的温柔    时间: 2013-8-1 12:37
张云杰 发表于 2013-8-1 05:08
当然拉..CPU执行速度很快的.. 你把D2这条线程放在了Main的后面了 所以D1线程开启后 然后就进行到循环了,等 ...

谢谢,明白了
作者: 手心里的温柔    时间: 2013-8-1 12:38
xwf4348 发表于 2013-8-1 09:21
你的d2.start();放在了for循环后,意思是说要等for循环打印完了才开启线程2,,所以当然是:运行结果 d1与ma ...

多谢 明白了
作者: 手心里的温柔    时间: 2013-8-1 12:38
nihaoligong 发表于 2013-8-1 10:06
三楼说的比较对,因为你最好才开启的   d2.start();  如果想要实现d1,d2线程交替打印加上注释的那两行,需 ...

谢谢,明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2