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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 月老~牵红线 中级黑马   /  2014-11-13 10:11  /  2405 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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循环在前和在后有什么区别?


评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
MVP + 1 + 1

查看全部评分

17 个回复

倒序浏览
我是这么理解的。如果for放到前面。只有主线程一个线程,另一个线程根本没开启,然后for完了才开启另一个线程;
for放下面  上面已经新开了一个线程,它和主线程同时执行。这时候才会出现互相抢资源的现象。

不对勿喷{:3_53:}
回复 使用道具 举报
这个涉及到线程是否抢到cpu资源的问题,主线程的for循环如果在线程前面,先执行完for循环后,才读到线程开启。如果主线程for循环在线程开启后,这时就是2个线程同时运行各自的for循环,谁抢到cpu执行权就执行谁。

评分

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

查看全部评分

回复 使用道具 举报
2楼正解, 在线程开启之前 只有主线程在运行,线程开启之后 cpu就会在它们之间切换执行
回复 使用道具 举报
多线程中,除了主线程,其他线程都需要被开启(例如d.start();),才能执行相应的run方法。
for循环放在前面的时候,主线程需要把for循环执行完才能执行到d.start(),这时候才会开启一个线程 调用对应的run方法。for循环放在前面的时候住线程先开启一个线程之后才会继续执行自己的代码。

也就是说创建线程后,需要调用线程的start()方法,改方法的作用: 启动线程,调用run方法。

评分

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

查看全部评分

回复 使用道具 举报
爱学习的小明 发表于 2014-11-13 11:11
这个涉及到线程是否抢到cpu资源的问题,主线程的for循环如果在线程前面,先执行完for循环后,才读到线程开 ...

谢谢了,理解了。就是说线程一开启就和其他线程抢cpu资源,谁抢到谁执行。
回复 使用道具 举报
for在前的话,如果for没有执行完,.start()没有执行,就只有一个主线程。
for在后的话,.strat()已经执行,是多线程了,所以会争夺CPU
回复 使用道具 举报
因为cpu在做着快速的替换
回复 使用道具 举报
把for放在d.start()前面的话
就是说,你创建了一个线程放在那
并没有启动他
而这时只有main一个线程
所以代码从上而下执行
把for循环执行完
然后执行到d.start()开启线程
才会运行的你手动创建的这个线程。
for循环放在d.start()后面
就是说创建了一个线程并启动了,
这时就有两个线程了
所以两个for就一起轮流执行了。
回复 使用道具 举报
线程的状态转换问题;
以及cpu切片原理
回复 使用道具 举报
二楼正解
回复 使用道具 举报
你这只是运行一次的结果。你把for放在start后面,然后多运行几次,结果就不一样了。因为你现在这种情况的出现可能是因为start后,主线程就抢到了cpu,所以for先执行了一部分,然后才切换到子线程执行
回复 使用道具 举报
郑飞 高级黑马 2014-11-14 00:01:12
13#
for在前面执行的时候只有单线程
for在后面执行的时候还有个d线程抢资源
回复 使用道具 举报
多运行几次,把数据调大一点就可以看出它们交替运行的效果了
回复 使用道具 举报
for循环属于主循环,你将for移到最前面按顺序执行会先循环完后才生成线程对象,所以在执行for循环的时候程序内只有一个循环在执行!
回复 使用道具 举报
把start放在循环后面,主线程当然要先执行完循环才会去开启另外一个线程了,我觉得和抢不抢资源没啥关系,在start之前这只不过是个单线程的程序,当然我是忽略掉了垃圾回收的那个线程
回复 使用道具 举报
其实:main作为一个主线程,而你自己创建了一个新的线程,当你新线程做start的时候,相当于是两个线程在运行,而Java中同级别线程是通过时间片轮换调度算法做调度,所以你会看到当主线程执行耗费完cpu分配的时间后,会切换到新线程执行,所以看到如下的结果。
回复 使用道具 举报
线程是具有唤醒和等待两种状态的, 它的执行是断断续续的.也就是说,在开启了线程之后一段时间会停下,然后再继续启动.当然,它不会影响线程开启之前的程序(for)(线程开启之前任何程序运行当然与它无关,嘿嘿)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马