先上一段代碼spa
public class YieldExcemple { public static void main(String[] args) { Thread threada = new ThreadA(); Thread threadb = new ThreadB(); // 設置優先級:MIN_PRIORITY最低優先級1;NORM_PRIORITY普通優先級5;MAX_PRIORITY最高優先級10 threada.setPriority(Thread.MIN_PRIORITY); threadb.setPriority(Thread.MAX_PRIORITY); threada.start(); threadb.start(); } } class ThreadA extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("ThreadA--" + i); Thread.yield(); } } } class ThreadB extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("ThreadB--" + i); Thread.yield(); } } }
本覺得運行結果以下:線程
ThreadB--0 ThreadA--0 ThreadB--1 ThreadA--1 ThreadB--2 ThreadA--2 ThreadB--3 ThreadA--3 ThreadB--4 ThreadA--4 ThreadB--5 ThreadA--5 ThreadB--6 ThreadA--6 ThreadB--7 ThreadA--7 ThreadB--8 ThreadA--8 ThreadB--9 ThreadA--9
結果卻出現了多種狀況,以下:code
ThreadB--0 ThreadB--1 ThreadB--2 ThreadB--3 ThreadB--4 ThreadB--5 ThreadB--6 ThreadB--7 ThreadB--8 ThreadB--9 ThreadA--0 ThreadA--1 ThreadA--2 ThreadA--3 ThreadA--4 ThreadA--5 ThreadA--6 ThreadA--7 ThreadA--8 ThreadA--9
或者blog
ThreadB--0 ThreadA--0 ThreadB--1 ThreadA--1 ThreadA--2 ThreadA--3 ThreadA--4 ThreadA--5 ThreadA--6 ThreadA--7 ThreadA--8 ThreadA--9 ThreadB--2 ThreadB--3 ThreadB--4 ThreadB--5 ThreadB--6 ThreadB--7 ThreadB--8 ThreadB--9
後翻閱資料得知:it
Java線程中的Thread.yield( )方法,譯爲線程讓步。顧名思義,就是說當一個線程使用了這個方法以後,它就會把本身CPU執行的時間讓掉,io
讓本身或者其它的線程運行,注意是讓本身或者其餘線程運行,並非單純的讓給其餘線程。class
yield()的做用是讓步。它能讓當前線程由「運行狀態」進入到「就緒狀態」,從而讓其它具備相同優先級的等待線程獲取執行權;可是,並不能保thread
證在當前線程調用yield()以後,其它具備相同優先級的線程就必定能得到執行權;也有多是當前線程又進入到「運行狀態」繼續運行!yield
舉個例子:一幫朋友在排隊上公交車,輪到Yield的時候,他忽然說:我不想先上去了,我們你們來競賽上公交車。而後全部人就一塊衝向公交車,方法
有多是其餘人先上車了,也有多是Yield先上車了。
可是線程是有優先級的,優先級越高的人,就必定能第一個上車嗎?這是不必定的,優先級高的人僅僅只是第一個上車的機率大了一點而已,
最終第一個上車的,也有多是優先級最低的人。而且所謂的優先級執行,是在大量執行次數中才能體現出來的。