簡體   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