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

學無止境發表於2020-06-19

 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() 方法不會釋放鎖。

相關文章