【線程讓步yield()方法】
yield()方法可以讓當前正在執行的線程暫停,但它不會阻塞該線程,它只是將該線程從運行狀態轉入就緒狀態。
只是讓當前的線程暫停一下,讓系統的線程調度器重新調度一次。
很有可能,當某個線程調用了yield()方法暫停之后進入就緒狀態,它又馬上搶占了CPU的執行權,繼續執行。
【注意】
實際上,當某個線程調用了yield()方法暫停之后,只有優先級與當前線程相同,或者優先級比當前線程更高的處於就緒狀態的線程才會獲得執行的機會。
【示例代碼】
package com.Higgin.part02; class YieldThread implements Runnable{ public void run() { for(int i=0;i<100;i++){ if(i==20){ //當i==20的時候,使用yield方法使當前線程讓步 Thread.yield(); } System.out.println(Thread.currentThread().getName()+"===="+i); } }; } public class Demo03 { public static void main(String[] args) { YieldThread yt=new YieldThread(); Thread t1=new Thread(yt,"高級"); t1.setPriority(Thread.MAX_PRIORITY); //將t1線程設置成最高優先級 Thread t2=new Thread(yt,"低級"); t2.setPriority(Thread.MIN_PRIORITY); //將t2線程設置成最低優先級 t2.start(); t1.start(); } }
【運行結果】
【注意】
在多CPU執行的情況下,效果可能會不明顯。
【小結:關於sleep和yield的區別】
1.sleep()方法暫停當前線程后,會給其他線程執行機會,線程優先級對此沒有影響。
yield()方法會給優先級相同或更高的線程更高的執行機會。
2.sleep()方法會將線程轉入阻塞狀態,直到阻塞時間結束,才會轉入就緒狀態。
yield()方法會將當前線程直接轉入就緒狀態。
3.sleep()方法聲明拋出了InterruptedException異常,所以調用sleep()方法時要么捕捉該異常,要么顯示聲明拋出該異常。
yield()方法則沒有聲明拋出任何異常。
4.sleep()方法比yield()方法有更好的移植性,通常不建議使用yield()方法來控制並發線程的執行。
【設置線程的優先級】
Thread了提供了以下兩個優先級相關方法:
1.setPriority( int newPriority ) :設置線程的優先級
2.getPriority( ):獲取線程的優先級
默認情況下,main主線程默認為NORM_PRIORITY普通優先級,其值為5。