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

Java 執行緒優先級機制:動態調整與執行緒組限制實戰

     編輯:Java 相關知識

優先級概念

執行緒優先級告訴調度器該執行緒重要程度。大量執行緒阻塞等待運行時,調度器優先運行最高優先級者。但**低優先級不代表不會運行**——只是獲得運行機會較少(不會因優先級導致死結)。

用 getPriority() 讀取、setPriority() 改變。

Counter5 互動示範程式

//: Counter5.java
class Ticker2 extends Thread {
    private Button b = new Button("Toggle"),
                   incPriority = new Button("up"),
                   decPriority = new Button("down");
    private TextField t = new TextField(10), pr = new TextField(3); // 顯示優先級
    private int count = 0;
    private boolean runFlag = true;
    
    public Ticker2(Container c) {
        // ... 介面佈局、監聽器綁定 ...
    }
    
    class UpL implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int newPriority = getPriority() + 1;
            if(newPriority > Thread.MAX_PRIORITY) newPriority = Thread.MAX_PRIORITY;
            setPriority(newPriority);
        }
    }
    class DownL implements ActionListener { /* 類似降低優先級 */ }
    
    public void run() {
        while (true) {
            if(runFlag) {
                t.setText(Integer.toString(count++));
                pr.setText(Integer.toString(getPriority()));
            }
            yield(); // 關鍵:交出控制權
        }
    }
}

public class Counter5 extends Applet {
    // ... 建立 10 個 Ticker2、啟動按鈕、調整執行緒組最高優先級按鈕 ...
    // 遞迴顯示父執行緒組優先級
} ///:~

關鍵觀察與實驗結果

  1. yield() 關鍵作用: 自動交還控制權給調度器。若移除,多執行緒仍運作但速度變慢(可試試刪除)。可用 sleep() 替代,但計數頻率會由 sleep 時間控制而非優先級
  2. 執行緒組預設優先級 5: 即使啟動前將最高優先級降到 5 以下,每個執行緒仍有預設優先級 5
  3. 簡單測試: 將一計數器優先級降至 1 → 計數頻率明顯放緩。提升可回到組優先級,但不可更高
  4. 降低組優先級兩次: 執行緒優先級不變,但嘗試調整時自動變成組優先級
  5. 新執行緒仍有預設優先級: 即使比組優先級高(別指望組優先級防止新執行緒擁有更高優先級)
  6. 提高組最高優先級無效: 只能減少,不能增大

同步效率代價

獲取鎖非「廉價」——單次方法調用代價(進入/退出,不執行主體)至少累加 4 倍,視實作方案可能更高。若知某方法不會衝突,**最明智做法是移除 synchronized**。

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