Thread.yield()方法


Thread.yield()方法是Thread類中的靜態方法,直接由類名調用。

 yield表示讓步、放棄的意思。

  • Thread.yield() 方法,使當前線程由執行狀態,變成為就緒狀態,讓出CPU,在下一個線程執行時候,此線程有可能被執行,也有可能沒有被執行。

  • 《Java編程思想》中這樣描述:Thread,yield()方法的調用,是對線程調度器(Java線程計制的一部分,可以將CPU從一個線程轉移到另一個線程)的建議,它在聲明:“我已經執行完生命周期中最重要的部分了,此刻正是切換給其他任務執行一段時間的大好時機。”這完全是選擇性的。

 

  • 《JDK11中文手冊》中這樣描述:向調度程序提示當前線程願意讓出其當前使用的處理器。 調度程序可以忽略此提示

  Yield是一種啟發式嘗試,用於改善線程之間的相對進展,否則會過度利用CPU。 它的使用應與詳細的分析和基准測試相結合,以確保它實際上具有所需的效果。

  使用此方法很少合適。 它可能對調試或測試目的很有用,它可能有助於重現因競爭條件而產生的錯誤。 在設計並發控制結構(例如java.util.concurrent.locks包中的結構)時,它也可能很有用。

class YieldThread implements Runnable {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "-" + i);
            if (i == 3) {
                Thread.yield();
            }
        }
    }
}
public class YieldDemo {
    public static void main(String[] args) {
        YieldThread yThield = new YieldThread();
        new Thread(yThield,"A").start();
        new Thread(yThield,"B").start();
    }
}
  • 根據運行情況得出結論:

 

    通過對比使用Thread.yield()方法和未使用的運行結果,可以發現使用yield()方法后,很大概率上出現讓出CPU給其它線程執行的情況。

 1 class YieldThread implements Runnable {
 2     public void run() {
 3         for (int i = 0; i < 5; i++) {
 4             System.out.println(Thread.currentThread().getName() + "-" + i);
 5             if (i == 3) {
 6                 Thread.yield();
 7             }
 8         }
 9     }
10 }
11 public class YieldDemo {
12     public static void main(String[] args) {
13         YieldThread yThield = new YieldThread();
14         Thread t1 = new Thread(yThield,"t1");
15         Thread t2 = new Thread(yThield,"t2");
16         t1.setPriority(1);
17         t2.setPriority(10);
18         System.out.println("t1.getPriority()"+t1.getPriority());
19         System.out.println("t2.getPriority()"+t2.getPriority());
20         t1.start();
21         t2.start();
22     }
23 }
  • 根據運行情況得出結論:

    實際運行中發現,Thread.yield()方法並不是僅僅選擇讓步於同等或者更高優先級的線程。高優先級的線程也會讓步與低優先級的線程。因此高優先級僅僅是線程獲得的CPU時間片更多一些,相對執行到的機會更大,並不是一定先執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM