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

Java 執行緒優先級設定與排程行為觀察

     編輯:Java 程式設計入門

執行緒優先級:建議而非保證

Java 提供 10 個優先級常數(MIN_PRIORITY=1 到 MAX_PRIORITY=10,預設 NORM_PRIORITY=5)。優先級僅是對執行緒排程器的「建議」,具體執行順序取決於作業系統排程器,不保證高優先級必定先執行或獲得更多 CPU 時間。

完整程式碼:upPRIThread.java

import java.util.*;

public class upPRIThread {
    public static void main(String[] args) throws Exception {
        Thread1 t1 = new Thread1();
        t1.start();
        Thread2 t2 = new Thread2();
        t2.start();

        t1.setPriority(Thread.MIN_PRIORITY); // 1
        t2.setPriority(Thread.MIN_PRIORITY); // 1
        new Thread().sleep(105);             // 讓兩條都以低優先級運行一段

        t2.setPriority(Thread.MAX_PRIORITY); // 10:提升 t2 優先級
        new Thread().sleep(10500);           // 觀察長時間行為
    }

    // 執行緒 1:始終低優先級
    static class Thread1 extends Thread {
        public void run() {
            while (true) {
                try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); }
                System.out.println("我是執行緒111");
            }
        }
    }

    // 執行緒 2:中途提升優先級
    static class Thread2 extends Thread {
        public void run() {
            while (true) {
                try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); }
                System.out.println("我是執行緒222.........................");
            }
        }
    }
}

執行觀察重點

  • 前 105ms:兩執行緒同為優先級 1,輸出交替出現
  • 提升 t2 為優先級 10 後:t2 輸出頻率明顯增加(視 OS 排程而定)
  • 長時間運行:t2 佔據大多數 CPU 時間片(但不保證 100%)

優先級相關 API

方法/常數說明
setPriority(int)設定優先級(1-10),超出範圍拋出 IllegalArgumentException
getPriority()取得目前優先級
MIN_PRIORITY (1)最低優先級
NORM_PRIORITY (5)預設優先級
MAX_PRIORITY (10)最高優先級

⚠️ 關鍵誤區與最佳實務

誤區事實建議
高優先級保證先執行僅是建議,OS 可能忽略不依賴優先級實現業務邏輯順序
優先級解決飢餓問題可能加劇低優先級飢餓使用公平鎖、信號量等同步機制
即時系統必須用高優先級Java 非即時語言,GC 停頓不可控即時需求用 RTSJ 或原生代碼

守護執行緒 vs 使用者執行緒

相關概念:setDaemon(true) 設定守護執行緒,JVM 僅剩守護執行緒時會自動退出。優先級與守護屬性獨立。

現代替代方案

  • 執行緒池:ThreadPoolExecutor 透過隊列與核心數控制並發,而非優先級
  • CompletableFuture:非同步任務編排,優先級由框架內部管理
  • 虛擬執行緒:Java 21+ Thread.ofVirtual(),大量輕量執行緒無需手動調優先級

適用場景

  • 背景維護任務(GC、清理)設低優先級
  • UI 事件處理、即時回應任務設高優先級
  • 教學/測試觀察排程行為

優先級是精細調整工具,非架構級解決方案。優先掌握執行緒池、非同步編程等現代並發模式。

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