核心概念釐清
搶佔式 ≠ 時間片輪轉。常見誤區將兩者混淆。Java 執行緒通常為搶佔式,但不保證時間片輪轉(分配等量 CPU 時間)。
平台相關行為差異
| 平台 | 同優先級搶佔 | 高優先級搶佔低優先級 | 備註 |
| Solaris | 不支援 | 支援 | 相同優先級執行緒不會互搶 CPU |
| Windows | 支援(時間片) | 支援 | 甚至可能搶佔更高優先級執行緒 |
關鍵結論: 跨 JVM 實現,無絕對搶佔或時間片保證。唯一可控手段是程式碼中正確使用 wait() 與 sleep()。
搶佔式調度模型
- 多執行緒處於「可執行」狀態,但同一時刻僅一執行緒實際運行
- 執行緒持續運行直到:
- 主動放棄(如呼叫
sleep()、等待資源、I/O 阻塞)
- 更高優先級執行緒變為可執行狀態(被搶佔)
執行緒狀態與佇列機制
- 所有可執行執行緒按優先級分佈於不同佇列(池)
- 阻塞執行緒恢復可執行時,重新放入對應優先級佇列
- 非空最高優先級佇列的執行緒獲得 CPU 時間
優先級機制的不確定性
- 多數 JVM 表現為搶佔式優先級,但規範不保證優先級有任何語義
- Windows 系統排程器干擾:Java Priority 4 執行緒可能運行,即使 Priority 5 可執行執行緒在等待
- 實際上許多 JVM 用佇列實現池,但非規範保證行為
實務建議
- 不要依賴執行緒優先級進行關鍵同步邏輯
- 跨平台部署時,必須在目標平台實測執行緒行為
- 同步控制應使用
synchronized、Lock、wait/notify 等顯式機制
- 長時間計算任務主動呼叫
Thread.yield() 讓出 CPU