1.yield()定義:
yield()方法的作用是放棄當前的cpu的資源,將他讓給其他的任務去佔用cpu執行時間。 但是放棄的時間不確定,有可能剛剛放棄又馬上獲得cpu時間片。《java多線程編程核心技術》
2.如何更好理解yield()?
yield()的作用是讓步。它能讓當前線程由“運行狀態”進入到“就緒狀態”,從而讓其它具有相同優先級的等待線程獲取執行權;但是,並不能保證在當前線程調用yield()之後,其它具有相同優先級的線程就一定能獲得執行權;也有可能是當前線程又進入到“運行狀態”繼續運行!
舉個例子:一幫朋友在排隊上公交車,輪到Yield的時候,他突然說:我不想先上去了,咱們大家來競賽上公交車。然後所有人就一塊衝向公交車,有可能是其他人先上車了,也有可能是Yield先上車了。(內容來源:https://www.cnblogs.com/java-spring/p/8309931.html)
3.實例
(1).未使用yield
package com.springboot.thread;
public class ThreadYield {
/*
* yield()方法的作用是放棄當前的cpu的資源,將他讓給其他的任務去佔用cpu執行時間。
* 但是放棄的時間不確定,有可能剛剛放棄又馬上獲得cpu時間片。
* */
public static void main(String[] args) {
Thread thread = new Thread(){
int count = 0;
@Override
public void run() {
long beginTime =System.currentTimeMillis();
for (int i = 0 ;i<= 50000000; i++) {
//Thread.yield();
count = count +(i+1);
}
long endTime = System.currentTimeMillis();
System.out.println("Time spent by the program is :" +(endTime-beginTime)+"ms");
}
};
thread.start();
}
}
運行結果:
Time spent by the program is :20ms
(2).使用yield()
package com.springboot.thread;
public class ThreadYield {
/*
* yield()方法的作用是放棄當前的cpu的資源,將他讓給其他的任務去佔用cpu執行時間。
* 但是放棄的時間不確定,有可能剛剛放棄又馬上獲得cpu時間片。
* */
public static void main(String[] args) {
Thread thread = new Thread(){
int count = 0;
@Override
public void run() {
long beginTime =System.currentTimeMillis();
for (int i = 0 ;i<= 50000000; i++) {
Thread.yield();
count = count +(i+1);
}
long endTime = System.currentTimeMillis();
System.out.println("Time spent by the program is :" +(endTime-beginTime)+"ms");
}
};
thread.start();
}
}
運行結果:
Time spent by the program is :3586ms
從運行結果更好的說明了,使用yield()當前線程會主動放棄cpu資源,從而花費了更多時間。
參考資料:
1.java多線程編程核心技術