黑马程序员技术交流社区

标题: 关于多线程的一个小问题 [打印本页]

作者: 月老~牵红线    时间: 2014-11-13 10:11
标题: 关于多线程的一个小问题
  1. class Demo extends Thread
  2. {
  3.         public void run()
  4.         {
  5.                 for(int x=0; x<60; x++)
  6.                         System.out.println("demo run----"+x);
  7.         }
  8. }
  9. class ThreadDemo
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 Demo d = new Demo();//创建好一个线程。
  14.                 d.start();//开启线程并执行该线程的run方法。
  15.                 for(int x=0; x<60; x++)
  16.                         System.out.println("hello word----"+x);               
  17.         }
  18. }
复制代码

这是一个多线程程序。运行结果是:


当我把for循环放在前面时,程序会把for循环执行完,再执行d线程。
我的问题是:for循环在后面时,为什么循环没有执行完就开始了新的线程呢?for循环在前和在后有什么区别?



作者: 马个了黑_邓    时间: 2014-11-13 10:45
我是这么理解的。如果for放到前面。只有主线程一个线程,另一个线程根本没开启,然后for完了才开启另一个线程;
for放下面  上面已经新开了一个线程,它和主线程同时执行。这时候才会出现互相抢资源的现象。

不对勿喷{:3_53:}
作者: 爱学习的小明    时间: 2014-11-13 11:11
这个涉及到线程是否抢到cpu资源的问题,主线程的for循环如果在线程前面,先执行完for循环后,才读到线程开启。如果主线程for循环在线程开启后,这时就是2个线程同时运行各自的for循环,谁抢到cpu执行权就执行谁。
作者: wf111sxwf    时间: 2014-11-13 11:16
2楼正解, 在线程开启之前 只有主线程在运行,线程开启之后 cpu就会在它们之间切换执行

作者: 王世虎    时间: 2014-11-13 11:25
多线程中,除了主线程,其他线程都需要被开启(例如d.start();),才能执行相应的run方法。
for循环放在前面的时候,主线程需要把for循环执行完才能执行到d.start(),这时候才会开启一个线程 调用对应的run方法。for循环放在前面的时候住线程先开启一个线程之后才会继续执行自己的代码。

也就是说创建线程后,需要调用线程的start()方法,改方法的作用: 启动线程,调用run方法。
作者: 月老~牵红线    时间: 2014-11-13 11:26
爱学习的小明 发表于 2014-11-13 11:11
这个涉及到线程是否抢到cpu资源的问题,主线程的for循环如果在线程前面,先执行完for循环后,才读到线程开 ...

谢谢了,理解了。就是说线程一开启就和其他线程抢cpu资源,谁抢到谁执行。
作者: 高昌德    时间: 2014-11-13 12:12
for在前的话,如果for没有执行完,.start()没有执行,就只有一个主线程。
for在后的话,.strat()已经执行,是多线程了,所以会争夺CPU
作者: 327753899    时间: 2014-11-13 14:18
因为cpu在做着快速的替换
作者: javaAndroid    时间: 2014-11-13 20:46
把for放在d.start()前面的话
就是说,你创建了一个线程放在那
并没有启动他
而这时只有main一个线程
所以代码从上而下执行
把for循环执行完
然后执行到d.start()开启线程
才会运行的你手动创建的这个线程。
for循环放在d.start()后面
就是说创建了一个线程并启动了,
这时就有两个线程了
所以两个for就一起轮流执行了。
作者: zhangyangLengen    时间: 2014-11-13 21:26
线程的状态转换问题;
以及cpu切片原理

作者: Sxxjava    时间: 2014-11-13 21:50
二楼正解
作者: DamonZh    时间: 2014-11-13 22:09
你这只是运行一次的结果。你把for放在start后面,然后多运行几次,结果就不一样了。因为你现在这种情况的出现可能是因为start后,主线程就抢到了cpu,所以for先执行了一部分,然后才切换到子线程执行
作者: 郑飞    时间: 2014-11-14 00:01
for在前面执行的时候只有单线程
for在后面执行的时候还有个d线程抢资源
作者: dong53821713    时间: 2014-11-14 09:01
多运行几次,把数据调大一点就可以看出它们交替运行的效果了
作者: lwh316658735    时间: 2014-12-1 17:22
for循环属于主循环,你将for移到最前面按顺序执行会先循环完后才生成线程对象,所以在执行for循环的时候程序内只有一个循环在执行!
作者: caobin    时间: 2014-12-1 19:56
把start放在循环后面,主线程当然要先执行完循环才会去开启另外一个线程了,我觉得和抢不抢资源没啥关系,在start之前这只不过是个单线程的程序,当然我是忽略掉了垃圾回收的那个线程
作者: hello_csu    时间: 2014-12-1 20:35
其实:main作为一个主线程,而你自己创建了一个新的线程,当你新线程做start的时候,相当于是两个线程在运行,而Java中同级别线程是通过时间片轮换调度算法做调度,所以你会看到当主线程执行耗费完cpu分配的时间后,会切换到新线程执行,所以看到如下的结果。
作者: a371166028    时间: 2014-12-1 20:59
线程是具有唤醒和等待两种状态的, 它的执行是断断续续的.也就是说,在开启了线程之后一段时间会停下,然后再继续启动.当然,它不会影响线程开启之前的程序(for)(线程开启之前任何程序运行当然与它无关,嘿嘿)




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