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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CHJ 中级黑马   /  2013-9-9 17:57  /  1553 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 CHJ 于 2013-9-9 18:25 编辑
  1. class Demo extends Thread
  2. {
  3.         public void run()
  4.         {
  5.                 for (int x = 0; x < 50; ++x)
  6.                 {
  7.                         System.out.println("x = " + x);
  8.                 }               
  9.         }
  10. }


  11. class ThreadDemo
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 Demo d = new Demo(); //创建一个线程
  16.                 d.start();//开启线程并执行线程的run方法
  17.                 //d.run   //仅仅是对象调用方法,而线程创建了,并没有运行

  18.                 for (int x = 0; x < 50; ++x)
  19.                 {
  20.                         System.out.println("Hello World!---" + x);
  21.                 }
  22.         }
  23. }
复制代码
我执行了很多次,发现每次第一个打印的都是“Hello World!--- 0”,是因为先进主线程么?
------------------------
在毕老师11天02的视频里25分40秒左右,老师说有可能先执行完run(),在执行主函数,谁帮我解释一下啊

评分

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

查看全部评分

9 个回复

倒序浏览

如图,多线程是靠CPU不断切换执行的线程来实现的。
当指针指向哪个线程的时候就执行哪个线程。
所以线程的执行顺序是随机的
回复 使用道具 举报
武嘉豪 发表于 2013-9-9 18:17
如图,多线程是靠CPU不断切换执行的线程来实现的。
当指针指向哪个线程的时候就执行哪个线程。
所以线程的 ...

额,谢谢了,看来我执行了100来次,都是巧合。。。
回复 使用道具 举报
main也是线程,
Demo d = new Demo(); //创建一个线程

d.start();//开启线程并执行线程的run方法

线程的执行顺序是随机的,分配给谁资源就执行下。

反例.jpg (28.92 KB, 下载次数: 30)

看看哦

看看哦
回复 使用道具 举报
李锡碧 发表于 2013-9-9 18:22
main也是线程,
Demo d = new Demo(); //创建一个线程

嗯嗯,ok了~谢了哈
回复 使用道具 举报
CHJ 发表于 2013-9-9 18:25
嗯嗯,ok了~谢了哈

那个传错了

反例2.jpg (19.55 KB, 下载次数: 26)

反例2.jpg
回复 使用道具 举报
CHJ 中级黑马 2013-9-9 18:32:31
7#

你执行的时候,x=0在上面的次数多么,我刚才又试了试,终于出现了一次。。。
回复 使用道具 举报
首先主线程一直都存在的,执行到d.start()的时候开启了一个线程和主线程交替运行,这时不存在谁先谁后的关系。可能是你的cup问题吧,你多试几下应该没问题的。在我的机器上运行是ok的:
回复 使用道具 举报
CHJ 发表于 2013-9-9 18:32
你执行的时候,x=0在上面的次数多么,我刚才又试了试,终于出现了一次。。。 ...

随机的,不过概率分布上可能偏向main线程的感觉...  
回复 使用道具 举报
随机的。。主线程先出现的概率比较大,多试试。会出现其他情况的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马