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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马刘岩 中级黑马   /  2012-12-27 15:16  /  2416 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2. 需求:创建两个线程,和主线程交替运行
  3. */
  4. class Demo extends Thread
  5. {
  6.         Demo(String s)
  7.         {
  8.                 super(s);
  9.         }
  10.         public void run()
  11.         {
  12.                 for (int x=0;x<60 ;x++ )
  13.                 {
  14.                         System.out.println(Thread.currentThread().getName()+"is running"+x);
  15.                 }
  16.         }
  17. }
  18. class ThreadDemo
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Demo d=new Demo("线程1");
  23.                 Demo d1=new Demo("线程2");
  24.                 d.start();
  25.                 d1.start();
  26.                 for (int y=0;y<60 ;y++ )
  27.                 {
  28.                         System.out.println("Thread main is running!");
  29.                 }
  30.         }
  31. }
复制代码
我写的多线程有问题吗?为啥有时结果不会交替运行呢?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

8 个回复

倒序浏览
没有什么问题啊,结果又不是一定会交替运行的。可能某个线程获得了执行权,但还是处在等待状态啊,
它没有抢过其他的线程,或者cpu决定处理某个线程多一点,处理某个线程少一点这也是有可能的啊。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
辛攀 发表于 2012-12-27 15:29
没有什么问题啊,结果又不是一定会交替运行的。可能某个线程获得了执行权,但还是处在等待状态啊,
它没有 ...

哦,这样啊,结果太整齐,难免心虚,你懂得~
回复 使用道具 举报
有交替啊,但是不是很明显,数值大点的话就能看得更清楚点
回复 使用道具 举报
每次程序运行都是先运行主进程,即main方法所在线程,之后CPU会根据资源在几个线程之间切换,程序在不同的计算机运行或在同一台计算机反复运行的结果不尽相同,输出的结果依赖于当前CPU的使用情况,所以不要烦恼了,如果想交替的话就设置一下休眠时间吧

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
这个是三个线程争夺CPU的控制权导致的,有的执行时间多,有的少

把数弄大点就好看多了
回复 使用道具 举报
yuchen208 来自手机 中级黑马 2012-12-30 10:33:34
7#
写个等待sleep
回复 使用道具 举报
你的程序没有问题,结果不是交替运行这说明某一线程没有抢到执行权,这很正常,要想使程序交替运行,你需要使用等待唤醒机制
回复 使用道具 举报
cyh8807 中级黑马 2012-12-30 13:11:17
9#
你本身的代码没有任何问题,是可以实现交替运行的,多线程的运行行为看做是互相抢夺CPU的执行权,
谁抢到执行权,谁就执行,某一个时刻只能有一个程序在运行
如果你看不到交替运行,建议在第一个线程开启后,让它slee()一段时间:
下面是我给加的一段代码,希望对你有帮助;
  1. class ThreadDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Demo d=new Demo("线程1");
  6.                 Demo d1=new Demo("线程2");
  7.                 d.start();
  8.                 try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
  9.                 d1.start();
  10.                 for (int y=0;y<60 ;y++ )
  11.                 {
  12.                         System.out.println("Thread main is running!");
  13.                 }
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

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