(轉)Thread中yield方法
阿新 • • 發佈:2018-12-27
先上一段程式碼
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
結果卻出現了多種情況,如下:
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
或者
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
後翻閱資料得知:
Java執行緒中的Thread.yield( )方法,譯為執行緒讓步。顧名思義,就是說當一個執行緒使用了這個方法之後,它就會把自己CPU執行的時間讓掉,
讓自己或者其它的執行緒執行,注意是讓自己或者其他執行緒執行,並不是單純的讓給其他執行緒。
yield()的作用是讓步。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保
證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行!
舉個例子:一幫朋友在排隊上公交車,輪到Yield的時候,他突然說:我不想先上去了,咱們大家來競賽上公交車。然後所有人就一塊衝向公交車,
有可能是其他人先上車了,也有可能是Yield先上車了。
但是執行緒是有優先順序的,優先順序越高的人,就一定能第一個上車嗎?這是不一定的,優先順序高的人僅僅只是第一個上車的概率大了一點而已,
最終第一個上車的,也有可能是優先順序最低的人。並且所謂的優先順序執行,是在大量執行次數中才能體現出來的。