一、yield()介紹this
yield()的做用是讓步。它能讓當前線程由「運行狀態」進入到「就緒狀態」,從而讓其餘具備相同優先級的等待進程獲取執行權;可是,並不能保證在當前線程調用yield()以後,其餘具備相同優先級的線程就必定能得到執行權;也有多是當前線程又進入到「運行狀態」繼續運行spa
二、yield()示例線程
class ThreadA extends Thread { public ThreadA(String name) { super(name); } public synchronized void run() { for(int i = 0;i < 10;i++) { System.out.printf("%s [%d]: %d\n", this.getName(), this.getPriority(),i); if(i%4 == 0) Thread.yield(); } } } public class YieldTest { public static void main(String[] args) { ThreadA t1 = new ThreadA("t1"); ThreadA t2 = new ThreadA("t2"); t1.start(); t2.start(); } }
運行結果:code
t1 [5]: 0 t2 [5]: 0 t1 [5]: 1 t1 [5]: 2 t1 [5]: 3 t1 [5]: 4 t2 [5]: 1 t2 [5]: 2 t1 [5]: 5 t1 [5]: 6 t1 [5]: 7 t1 [5]: 8 t2 [5]: 3 t2 [5]: 4 t1 [5]: 9 t2 [5]: 5 t2 [5]: 6 t2 [5]: 7 t2 [5]: 8 t2 [5]: 9
結果說明:對象
有時候當i能被4整除的時候,線程t1並無切換到線程t2,這代表,yield()雖然可讓線程由「運行狀態」進入到「就緒狀態」;可是,他不必定會讓其餘線程獲取CPU的執行權(即,其餘線程進入到「運行狀態」),即便這個「其餘線程」與當前調用yield()的線程具備相同的優先級blog
三、yield()與wait()的比較進程
wait()的做用是讓當前線程由「運行狀態」進入「阻塞狀態」的同時,也會釋放同步鎖。而yield()的做用是讓步,它也會讓當前線程離開「運行狀態」。他們的區別是:get
(01)wait()是讓線程由」運行狀態「進入到」等待/阻塞狀態「,而yield()是讓線程由」運行狀態「進入到」就緒狀態「同步
(02)wait()會讓線程釋放它所持有對象的同步鎖,而yield()方法不會釋放鎖it
示例:
public class YieldLockTest { private static Object obj = new Object(); public static void main(String[] args) { ThreadA t1 = new ThreadA("t1"); ThreadA t2 = new ThreadA("t2"); t1.start(); t2.start(); } static class ThreadA extends Thread { public ThreadA(String name) { super(name); } public void run() { synchronized (obj) { for(int i = 0;i <10;i++) { System.out.printf("%s [%d]: %d\n", this.getName(),this.getPriority(),i); if(i%4 == 0) Thread.yield(); } } } } }
運行結果:
t1 [5]: 0 t1 [5]: 1 t1 [5]: 2 t1 [5]: 3 t1 [5]: 4 t1 [5]: 5 t1 [5]: 6 t1 [5]: 7 t1 [5]: 8 t1 [5]: 9 t2 [5]: 0 t2 [5]: 1 t2 [5]: 2 t2 [5]: 3 t2 [5]: 4 t2 [5]: 5 t2 [5]: 6 t2 [5]: 7 t2 [5]: 8 t2 [5]: 9
結果說明:
主線程中啓動了兩個線程t1和t2。t1和t2在run()的時候會應用同一個對象的同步鎖,即obj的鎖。在t1運行的過程當中,雖然調用了yield()方法,可是t2不會獲取CPU執行權。由於t1並無釋放obj所持有的同步鎖