更新時間:2022年03月01日18時25分 來源:傳智教育 瀏覽次數(shù):
在校園中,經(jīng)常會看到很多同學一起打籃球,當某個同學搶到籃球后可以拍一會兒再傳遞給其他人,大家重新開始搶籃球,這個過程就相當于程序中的線程讓步。線程讓步可以通過yield()方法來實現(xiàn),該方法和sleep(long millis)方法有點類似,都可以讓當前正在運行的線程暫停,區(qū)別在于yield()方法不會阻塞該線程,它只是將線程轉(zhuǎn)換成就緒狀態(tài),讓系統(tǒng)的調(diào)度器重新調(diào)度一次。當某個線程調(diào)用yield()方法之后,與當前線程優(yōu)先級相同或者更高的線程可以獲得執(zhí)行的機會。接下來通過一個案例來演示yield()方法的使用,如例10-9所示。
例10-9 Example09.java
//定義YieldThread類繼承Thread類 class YieldThread extends Thread { //定義一個有參的構(gòu)造方法 public YieldThread(String name) { super(name); //調(diào)用父類的構(gòu)造方法 public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "---" + i); If(i == 2) { System.out.print( "線程讓步:"); Thread.yield(); //線程運行到此,作出讓步 } } } } public class Example09 { public static void main(String[] args) { //創(chuàng)建兩個線程 Thread threadl1 = new YieldThread("threadl"); Thread thread2 = new YieldThread("thread2"); //開啟兩個線程 Thread1.start(); thread2.start(); } }
運行結(jié)果如圖所示
例10-9中創(chuàng)建了兩個線程threadl和thread2,它們的優(yōu)先級相同。兩個線程在循環(huán)變量i等于2時,都會調(diào)用Thread的yield()方法,使當前線程暫停,讓兩個線程再次爭奪CUP使用權(quán),從運行結(jié)果可以看出,當線程thread1輸出2以后,會做出讓步,線程thread2獲得執(zhí)行權(quán),同樣,線程 thread2輸出2后,也會做出讓步,線程 threadl獲得執(zhí)行權(quán)。小提示:通過yield()方法可以實現(xiàn)線程讓步,讓當前正在運行的線程失去CPU使用權(quán),讓系統(tǒng)的調(diào)度器重新調(diào)度一次,由于Java虛擬機默認采用搶占式調(diào)度模型,所有線程都會再次搶占CUP資源使用權(quán),所以在執(zhí)行線程讓步后并不能保證立即執(zhí)行其他線程。