yield()方法无法按预期工作

时间:2014-08-22 05:34:47

标签: java multithreading

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()的文档,thread-1应该产生并允许thread-2在第3次循环之后进行处理。但是,输出并不像预期的那样。相同的线程继续跳过第3次迭代。在一个线程完成循环后,其他线程以相同的行为执行。请解释一下。

输出:

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] 

3 个答案:

答案 0 :(得分:5)

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

注意:其他线程可以再次使用同一个线程。无法保证JVM选择哪个线程。

答案 1 :(得分:1)

多线程的几乎所有方面一样,即使您的情况也不能保证按预期运行。 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()完全可以忽略(在您的情况下可能会发生这种情况。如果您反复获得相同的结果)

答案 2 :(得分:0)

阅读This文章。 yield方法是请求线程休眠。它可能发生与否。