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

Java 線程調度:yield() 讓步機制詳解

     編輯:Java 相關知識

Thread.yield() 基本概念

Thread.yield() 是一個靜態方法,用於提示當前線程願意放棄當前 CPU 時間片,讓其他同優先級或更高優先級的線程獲得執行機會。關鍵特性:

  • 不保證當前線程一定會讓步,僅是提示調度器
  • 線程狀態從 RUNNING 轉為 READY,不會進入 BLOCKED
  • 只能讓給相同或更高優先級的線程
  • 不釋放鎖資源

代碼示例:yield() 的行為觀察

/** 
 * Java線程:線程的調度-讓步
 * @author leizhimin
 */
public class Test {
    public static void main(String[] args) {
        Thread t1 = new MyThread1();
        Thread t2 = new Thread(new MyRunnable());
        t2.start();
        t1.start();
    }
}

class MyThread1 extends Thread {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("線程1第" + i + "次執行!");
        }
    }
}

class MyRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("線程2第" + i + "次執行!");
            Thread.yield(); // 每次循環主動讓步
        }
    }
}

運行結果分析

線程2第0次執行!
線程2第1次執行!
線程2第2次執行!
線程2第3次執行!
線程1第0次執行!
線程1第1次執行!
線程1第2次執行!
線程1第3次執行!
線程1第4次執行!
線程1第5次執行!
線程1第6次執行!
線程1第7次執行!
線程1第8次執行!
線程1第9次執行!
線程2第4次執行!
線程2第5次執行!
線程2第6次執行!
線程2第7次執行!
線程2第8次執行!
線程2第9次執行!
Process finished with exit code 0

觀察可見:線程2 前四次連續執行後,線程1 獲得 CPU 並連續執行完畢,線程2 才繼續。這說明:

  • yield() 讓線程2 短暫讓步,但調度器可能讓同優先級的線程1 執行
  • 線程1 無 yield(),一旦獲得 CPU 便連續運行
  • 最終兩線程都完成任務,但交替模式受調度器影響大

使用場景與注意事項

  • 適用於計算密集型任務主動讓出 CPU,提升系統響應性
  • 不應依賴 yield() 實現關鍵同步邏輯
  • 頻繁調用可能增加上下文切換開銷,降低整體性能
  • Java 文檔建議:「很少需要使用此方法」

出處:https://lavasoft.blog.51cto.com/62575/221811

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved