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時間片更多一些,相對執行到的機會更大,並不是一定先執行。