Java 多執行緒基礎(八)執行緒讓步

 Java 多執行緒基礎(八)執行緒讓步 yield

一、yield 介紹

yield()的作用是讓步。它能讓當前執行緒由「運行狀態」進入到「就緒狀態」,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒調用yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到「運行狀態」繼續運行。

二、yield 示例

public class YieldTest {
    private static Object obj = new Object();
    public static void main(String[] args) {
        Thread t1 = new MyThread("t1");
        Thread t2 = new MyThread("t2");
        t1.start();
        t2.start();
    }
    
    static class MyThread extends Thread{
        public MyThread(String name) {
            super(name);
        }
        public synchronized void run() {
            try {
                for(int i = 0;i < 5;i++) {
                    System.out.println(Thread.currentThread().getName() + "--" + this.getPriority() + "--"+ i);
                    if(i % 4 == 0)
                        Thread.yield();
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
// 執行結果(每次運行結果可能不同)

t1--5--0
t1--5--1
t2--5--0
t1--5--2
t1--5--3
t1--5--4
t2--5--1
t2--5--2
t2--5--3
t2--5--4

說明:

「執行緒t1」在能被4整數的時候,並沒有切換到「執行緒t2」。這表明,yield()雖然可以讓執行緒由「運行狀態」進入到「就緒狀態」;但是,它不一定會讓其它執行緒獲取CPU執行權(即,其它執行緒進入到「運行狀態」),即使這個「其它執行緒」與當前調用yield()的執行緒具有相同的優先順序。

三、yield() 與 wait()

我們知道,wait() 的作用是讓當前執行緒由「運行狀態」進入「等待(阻塞)狀態」的同時,也會釋放同步鎖。而 yield() 的作用是讓步,它也會讓當前執行緒離開「運行狀態」。它們的區別是:
①、wait()是讓執行緒由「運行狀態」進入到「等待(阻塞)狀態」,而 yield() 是讓執行緒由「運行狀態」進入到「就緒狀態」。
②、wait() 是會執行緒釋放它所持有對象的同步鎖,而 yield() 方法不會釋放鎖。