執行緒優先級告訴調度器該執行緒重要程度。大量執行緒阻塞等待運行時,調度器優先運行最高優先級者。但**低優先級不代表不會運行**——只是獲得運行機會較少(不會因優先級導致死結)。
用 getPriority() 讀取、setPriority() 改變。
//: 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、啟動按鈕、調整執行緒組最高優先級按鈕 ...
// 遞迴顯示父執行緒組優先級
} ///:~
sleep() 替代,但計數頻率會由 sleep 時間控制而非優先級獲取鎖非「廉價」——單次方法調用代價(進入/退出,不執行主體)至少累加 4 倍,視實作方案可能更高。若知某方法不會衝突,**最明智做法是移除 synchronized**。