首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線程 yield() 讓步機制深度解析

     編輯:Java 相關知識

yield() 介紹

Thread.yield() 是一個靜態方法,作用是讓當前正在執行的線程從「運行狀態」回到「就緒狀態」,讓出 CPU 執行權給相同優先級的其他線程。但不保證其他線程一定會獲得執行權,當前線程也可能立即再次被調度繼續執行。

程式碼範例

class ThreadA extends Thread {
    public ThreadA(String name) { super(name); }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s [%d]:%d%n", getName(), getPriority(), i);
            if (i % 4 == 0) Thread.yield(); // 每 4 次讓步
        }
    }
}

public class YieldTest {
    public static void main(String[] args) {
        new ThreadA("t1").start();
        new ThreadA("t2").start();
    }
}

執行結果分析

t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
...

可見 t1 在 i=0 調用 yield() 後,t2 並未立即搶佔 CPU,t1 繼續執行。這證明 yield() 僅是「建議」讓步,調度器不一定會切換線程。

yield() vs wait()

特性yield()wait()
狀態轉換運行 → 就緒運行 → 等待(阻塞)
釋放鎖否是
喚醒方式調度器重新選擇notify()/notifyAll()

yield() 不釋放鎖實證

public class YieldLockTest {
    private static final Object LOCK = new Object();
    static class ThreadA extends Thread {
        @Override public void run() {
            synchronized (LOCK) {
                for (int i = 0; i < 10; i++) {
                    System.out.printf("%s [%d]:%d%n", getName(), getPriority(), i);
                    if (i % 4 == 0) Thread.yield();
                }
            }
        }
    }
    public static void main(String[] args) {
        new ThreadA("t1").start();
        new ThreadA("t2").start();
    }
}

輸出顯示 t1 完整執行完 0~9 後 t2 才開始,證明 yield() 期間 t1 持有鎖,t2 無法進入同步區塊。

總結

  • yield() 適合禮讓同優先級線程,不涉及鎖釋放。
  • 不應依賴 yield() 實現線程協作,需配合鎖、Condition 或併發工具類。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved