Yield()方法未按预期工作


public class YieldDemo extends Thread{
   public static void main(String[] args) {
        YieldDemo y1 = new YieldDemo();
        YieldDemo y2= new YieldDemo();
        y1.start();
        y2.start();
   }
   public void run() {
      for(int i=0;i<=5;i++) {
           if(i==3) {
               Thread.yield();
           } else
               System.out.println(i+Thread.currentThread().toString());
           }
   }
}

根据yield()的文档,线程1应该屈服,并允许线程2在第三次循环后处理。然而,输出并不像预期的那样。同一线程继续跳过第三次迭代。在一个线程完成循环后,另一个线程以相同的行为执行。请解释。

输出:

0Thread[Thread-1,5,main] 
1Thread[Thread-1,5,main] 
2Thread[Thread-1,5,main] 
4Thread[Thread-1,5,main] 
5Thread[Thread-1,5,main] 
0Thread[Thread-0,5,main] 
1Thread[Thread-0,5,main] 
2Thread[Thread-0,5,main] 
4Thread[Thread-0,5,main] 
5Thread[Thread-0,5,main] 

java.lang.Thread.yield()方法导致当前正在执行的线程对象暂时暂停,并允许其他线程执行。

:另一个线程可以再次成为同一线程。不能保证JVM会选择哪个线程

多线程的几乎所有方面一样,即使您的情况也不能保证按预期的方式运行。Thread.yield()就像给操作系统的一个建议,告诉- 如果可能的话,那么请在这个之前执行其他线程。根据你的系统架构(内核数量,以及其他方面,如亲和性等),操作系统可能会忽略你的请求。

同样,在JDK6U23之后,JVM可能会将您的代码更改为:

   public void run() {
      for(int i=0;i<=5;i++) {
   // 3 is too darn small. and yield() is not necessary
   // so let me just iterate 6 times now to improve performance.  
     System.out.println(i+Thread.currentThread().toString());
   }

yield()可以完全忽略(这可能发生在您的情况中)。如果你一次又一次得到相同的结果)

阅读本文。方法是请求线程进入睡眠状态。这可能会发生,也可能不会。

最新更新