首先,我看yield()在我书上是翻译成礼让。

那么假如一个线程如果执行了yield()方法,是暂停自己,100%去执行别的线程去?

还是说先暂停下自己,然后和所有线程再一起重新排队等待cpu资源?

如果是第一种,为什么我发现礼让一次,线程本身又重新执行;

如果是第二种,那yield()拿来做什么用,不是达不到“礼让”的目的么?


1个回答

应该去看看操作系统 一个操作系统也就是一个虚拟机 虚拟机里面有很多很好的算法思想

比如线程的调度 (线程的调度不管最后怎么样,目的都是让CPU利用率最大化,不会让CPU闲着),这是一种效率最优的操作系统思想。在操作系统里面关于线程调度,线程A正在运行,需要调度线程B,指令集发出调用线程B的命令,这时候调用线程B肯定要调用很多必要的资源。在这段时间内,为了效率最优,线程A会一直运行,直到线程B所需的资源全部就绪才会给CPU资源让给线程B。这也是操作系统虚拟机的一种线程调度最优思想。想必JVM设计的时候也考虑到这一点,所以关于yield方法线程的调用也是这样的。(为了效率最优,线程A会一直运行,直到线程B所需的资源全部就绪才会给CPU资源让给线程B)

楼主可以做一个程序实验 定义线程A ThreadA{System.out.println("a");};定义线程B TrheadB{System.out.println("b");}

public static void main(){
  ThreadA a=new ....;
  THreadB b=new ....;
  for(10){  
  a.start();//打印10次
}   
  a.yield();//线程a让步
  a.sleep(300);//让线程a休眠300毫秒,为了让线程b所需资源被全部调用并被执行。
  b.start();//执行线程b
}

如果不加让a休眠300毫秒,结果应该是a打印10以上,然后b运行。

加上休眠300毫秒时间,结果就是a打印10次,然后b运行。加上300毫秒,为了让线程b所需资源被全部调用就绪,准备被执行。

这个结果正好验证了上面所说的线程调度最优的算法思想。