背景與挑戰
現代系統從人機交互轉向機機交互,業務對時效性要求極高。單靠演算法優化、硬體擴容已難滿足動態 QoS 需求。Java 線程優先級在不同作業系統表現差異大(Windows 甚至反對動態調整),且 `Thread` 物件開銷大(~30KB/線程),不適合大規模並發任務一一映射。
核心痛點
- Java 線程調度依賴 OS,跨平台行為不可預測
- 大量任務若各對應一 `Thread`,記憶體壓力過大
- 需在系統閒置時讓低優先級任務跑滿 CPU,過載時保障高優先級任務
解決方案:協調式多任務 + 訊息隊列 + 可調度執行緒池
架構三支柱
- 任務即訊息:每個任務封裝為一系列 `Method` 物件(利用反射 `Method.invoke`),放入優先級訊息隊列
- 單執行緒調度器:一個「死迴圈」從隊列取訊息按優先級執行 `invoke`,耗時操作可遞歸調用調度器主動讓出 CPU(類 `Yield`/`DoEvents`)
- 可縮放執行緒池:多條 `Thread` 共享同一 `Runnable`(調度器),透過動態增減 `Thread` 數量控制該隊列佔用 CPU 比例
關鍵創新點
- **任務與 `Thread` 解耦**:任務不再綁定 OS 線程優先級
- **優先級在應用層實現**:訊息隊列排序決定執行順序,跨平台一致
- **動態 CPU 配額**:運行時 `new Thread` / 讓執行緒退出,即時調整各隊列速度
- **過載保護**:隊列超長時拒絕/換出低優先級訊息,保障核心業務
同步與互斥
- 互斥:`synchronized` 關鍵字
- 同步(等待/通知):任務主動讓出執行權配合 `wait`/`notify` 實現
局限與應對