繁体   English   中英

yield()方法未按预期工作

[英]yield() method not working as expected

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在第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] 

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

注意 :该其他线程可以再次成为同一线程。 不能保证JVM选择哪个线程。

Multithreading的几乎所有方面一样,即使您的情况也不能保证表现出预期的效果。 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()可以完全忽略(在您的情况下可能会发生。如果您一次又一次地得到相同的结果)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM