为什么有时i==3的时候会输出线程礼让,而有时不输出呢???求解

解决方案 »

  1.   

    你这个不是都输出了吗....上面那种情况是刚输出完A正在执行3 另一个线程就抢走了CPU控制权, 输出它的B正在执行3 然后各自礼让 输出对应的线程礼让:   下面那个是礼让语句执行了但没有交出CPU控制权(礼让机制并不能保证另一个线程一定拿到CPU控制权   真正要做到请加同步锁 )  所以会继续输出线程礼让 
      

  2.   

    Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。        yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!      举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,有可能是其他人先上车了,也有可能是Yield先上车了。     但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。
      

  3.   

    其实都输出了,不过是显示误导了你,因为进程执行时间有误差的。第一个情况是 a进程执行到i=3 并打印了 进程名,但还没有执行了礼让,这时候 b进程也执行了i=3 并先与a执行礼让打印了 进程名,然后a进程执行礼让后,b进程执行礼让。第2个情况是 a进程执行更快执行过了打印进程名,并开始执行礼让时 b进程还没有执行 i=3 后的打印进程名。这种情况发生很正常。