黑马程序员技术交流社区

标题: Thread类的yield方法,请看问题。。。 [打印本页]

作者: HM李超    时间: 2013-4-15 17:57
标题: Thread类的yield方法,请看问题。。。
本帖最后由 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
为什么我的程序运行结果出现了如图所示的情况?怎么优先级低的线程被暂时后,还是跟优先级高级的线程同时执行了?


作者: 王大斌    时间: 2013-4-15 19:12
首先,你没明白Thread.yield方法的使用,它是暂停不动了吗?no

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

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

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




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