黑马程序员技术交流社区

标题: 关于Thread中的yield方法 [打印本页]

作者: sunalong    时间: 2013-7-24 16:48
标题: 关于Thread中的yield方法
本帖最后由 杨兴庭 于 2013-7-25 18:29 编辑

  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;

  4. /*
  5. * yield:暂停当前正在执行的线程对象,并执行其他线程。
  6. */
  7. class YieldTest implements Runnable{
  8.         Lock lock = new ReentrantLock();
  9.         //Condition condition = lock.newCondition();
  10.         public void run(){
  11.                 for(int x=0;x<70;x++){
  12.                         lock.lock();
  13.                         System.out.println(Thread.currentThread().getName() + "---" + x);
  14.                         Thread.yield();
  15.                         lock.unlock();//为什么结果不是交替运行的?
  16.                 }
  17.         }
  18. }
  19. public class ThreadYield {
  20.         public static void main(String[] args){
  21.                 YieldTest yt = new YieldTest();
  22.                 Thread t1 = new Thread(yt);
  23.                 Thread t2 = new Thread(yt);
  24.                 t1.start();
  25.                 t2.start();
  26.                
  27.                 for(int x=0;x<70;x++)
  28.                         System.out.println("main---" + x);
  29.         }
  30. }
复制代码
线程t1,t2的结果为什么不是交替的??

作者: 王峰230321    时间: 2013-7-24 18:45
yield  释放执行权 . 当t1执行到这的时候,  t1释放了执行权  .  
但是 t1是释放执行权.  并不是放弃执行权.   也不是你说的 暂停现有线程来运行其他线程
当t1执行到Thread.yield();  这句的时候,  停止了当前的线程. 然后 .t1 t2 主线程三方来抢执行权.
只是加上yield之后,this的线程连续抢到执行权的几率会很小..     
我个人理解哈.    不对的话 请见谅
作者: yangqing    时间: 2013-7-24 19:27
当前线程执行到yield时,释放了执行权 但是并没有 释放锁(释放锁的代码还没有执行到) 导致其他线程进不来。 只有当随机又执行到当前线程时而后进入到随机分配的模式。把  Thread.yield();
                                      lock.unlock();
换个位置。
作者: 黑马龙子    时间: 2013-7-25 19:44
在线程执行到yield时,此时t1就释放了执行权,而同时并没有执行到释放锁那一步,从而使其他的线程无法进入。在执行Thread.yield(); 时,当前的线程开始被停止,所有说在t1和t2的结果不是交替。





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