如果僅僅做到這一步完成一個像Windows 中的多任務系統實際只用了一個線程沒有利用Java多線程的特點應該注意到雖然Java系統中線程調度與平台相關但是相同優先級的線程之間分時運行的特點基本上是不受特定平台影響的各個相同優先級的線程共享CPU資源而線程又被映射成了Java語言中的Thread對象這些對象就可以被認為是CPU資源的代表Thread與線程執行代碼主體的接口—Runnable之間是多對一的關系一個Runnable可以被多個Thread 執行只要將Runnable的執行代碼設置成上述的消息調度函數並和消息隊列對應上那麼就可以通過控制為它服務的Thread個數來決定消息隊列執行的快慢並且在運行時可以動態地新增(new)和退出Thread對象這樣就能任意調整不同消息隊列在執行時所占用CPU資源的多少至此任何一個 Java調用都可以在Thread個數不同的消息隊列中選擇並可以調整這些消息隊列服務的Thread個數從而實現在運行時調整任務所占用的CPU資源
縱觀整個方案由於僅僅基於Java語言固有的Method對象不同任務間動態分配CPU資源並沒有對任務的性質及其處理流程有任何限制那麼在消息隊列中沒有高優先級消息時低優先級消息的處理函數自然會全部占用CPU資源在不同消息隊列處理速度任意設置時並沒有將特定的消息限制在快的或者慢的消息隊列上如果系統的負荷超出(比如消息隊列長度超過一定限制)只要將隊列中低優先級消息換出或者拒絕不能處理的消息進入那麼系統的運行就可以基本上不受負荷壓力的影響從而最大保障用戶的關鍵業務需求
當然協調式多任務的思想也有其局限性主要就是它的調度粒度比較大系統能夠保證的粒度是一次消息處理過程如果消息處理邏輯非常費時那麼編程人員就必須再處理函數內部讓系統主動讓出CPU資源這雖然需要在處理消息響應邏輯時增加一個考慮因素但是在Windows系統盛行的今天這是一個已經被普遍接受的思路由於方案中並沒有局限為消息隊列服務的線程數目所以一個長時間的消息響應只會影響一個線程而不會對整個系統產生致命的影響除了調度粒度的問題以外還有訪問消息隊列操作在各個線程間互斥的問題取出消息的過程是串行化的因此對於這一瓶頸的解決方案就是假設取出一條消息的操作相對於處理消息的消耗可以忽略不計那麼對於多次調用且僅有兩三行響應邏輯的消息編程人員通過函數調用就可以直接執行
前面比較詳細地闡述了多任務系統中任務的劃分以及執行等內容雖然這些是一個系統的核心但是在一個實用的系統中還需要任務間的同步互斥等機制在上述框架內互斥可以簡單地用Java的Synchronized機制實現由於任務可以主動讓出執行權限要實現等待(Wait任務中止)和通知(Notify任務繼續)從而實現任務同步也就比較容易了
[] [] []
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27233.html