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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM李超 高级黑马   /  2013-4-15 17:57  /  1147 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM李超 于 2013-4-16 09:34 编辑

示例程序:
  1. class TestYield extends Thread
  2. {
  3.         public TestYield()
  4.         {
  5.         
  6.         }
  7.         public TestYield(String name)
  8.         {
  9.                 super(name);
  10.         }
  11.         public void run()
  12.         {
  13.                 for(int i=0;i<50;i++)
  14.                 {
  15.                         System.out.println(getName()+" "+i);
  16.                         if(i==20)
  17.                                 Thread.yield();    //使用yield方法让当前线程让步
  18.                 }
  19.         }
  20.         public static void main(String[] args)
  21.         {
  22.                 //启动两条并发线程
  23.                 TestYield ty1=new TestYield("高级");
  24.                 ty1.setPriority(Thread.MAX_PRIORITY);   //将ty1设置成最高优先级
  25.                 ty1.start();
  26.                 TestYield ty2=new TestYield("低级");    //将ty2设置成最低优先级
  27.                 ty2.setPriority(Thread.MIN_PRIORITY);
  28.                 ty2.start();
  29.         }
  30. }
复制代码
结果:
i
问题:我们知道当某个线程调用了yield方法暂停后,只有优先级与当前线程相同或更高的就绪状态的线程才可以得到运行的机会。
如程序分别ty1的优先级为最高级和ty2为优先级最低级,按理应该是ty2运行20次后,调用了yield方法暂停,但ty1的优先级最高,ty1这条线程应该继续执行,
得到的结果应该是:低级20-->高级n-->高级n+1-->高级n+2-->高级...-->高级50-->低级21-->低级...-->低级50
为什么我的程序运行结果出现了如图所示的情况?怎么优先级低的线程被暂时后,还是跟优先级高级的线程同时执行了?

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

1 个回复

倒序浏览
首先,你没明白Thread.yield方法的使用,它是暂停不动了吗?no

当一个线程处于执行状态时候,防止某线程独占CPU资源,而其它线程一直等待。使用yield方法使其行执行状态到了就绪状态,和其它进程具有了共同强占
cpu的权利。但是至于谁抢到,这不确定。也有可能是刚刚暂停的线程抢到了cpu继续执行,。我觉得这个方法不应该是暂停,而是使线程从执行态进入到就绪状态。

而优先级则更不可靠
优先级越高的线程被线程调度器调用的几率就越高 ,但是不一定就调用它

这样说吧,我的优先级为9 也就是99%可能得到cpu资源,而你的优先级为1,也就是1%可能得到cpu资源
但是我能确保我能每次抢到吗?
也有可能你每次都抢到。。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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