面對多核系統,Java 內建併發工具(執行緒、synchronized、java.util.concurrent)仍嫌複雜。Actor 模型(源自 Erlang、Scala、Groovy)以訊息傳遞取代共享記憶體,每個 Actor 獨立處理訊息、非同步發送訊息給其他 Actor,天然適合平行化。μJavaActors 僅 1,200 行程式碼,提供動態建立/管理 Actor、訊息路由、執行緒池調度的完整實作。
source(發送者)、subject(主題/指令)、data(參數資料);提供 subjectMatches() 比對。createActor、startActor、detachActor)與訊息分發(send/broadcast)。預設實作 DefaultActorManager 內建低優先級背景執行緒池(預設 25 條)。category);核心方法 receive() 從郵箱取出訊息呼叫 loopBody(Message),willReceive() 可過濾主題。建立 7 個 TestActor(2 個 common 分類、5 個預設分類),啟動後各 Actor 發送 init 訊息觸發 repeat 連鎖,訊息計數遞減至 0 結束。追蹤輸出顯示訊息在 25 條執行緒間動態分發,無 Actor 綁定固定執行緒。模擬器視覺化呈現:綠條代表執行緒利用率,圓環為 Actor,連線為訊息(紅色新訊息、其他色緩衝訊息),歷史區顯示積壓與消退趨勢。
ProducerActor:接收 produceN 拆解為多個 produce1,再轉發 construct 給對應分類的 ConsumerActor;收到 constructionComplete 遞減計數。ConsumerActor:處理 construct 模擬延遲後回覆 constructionComplete。CommandActor 支援 execute/executeStatic 訊息,透過反射載入類別並呼叫 execute(Object),將結果或異常封裝為 executeComplete 回覆給發送者。適合服務調度、外掛系統。
DelegatingActor 維護 MessageListener 清單,收到訊息逐一觸發 onMessage 直到被消費。鬆綁 Actor 系統與具體處理邏輯,支援動態增減監聽器。
MapReduceActor 將大陣列分割為分區,發送 mapWorker 平行映射(如平方),收集 mapResponse 計數歸零後啟動 reduceWorker 平行歸約(如求和),最終彙總送出 done。展示複雜分階段協調、狀態封裝於訊息參數、動態建立 Actor 處理分區。
testMessage() 取得符合條件訊息,移除後執行 loopBody,最後 manager.awaitMessage(this) 登記等待下一條。LinkedHashMap 維護 actors/runnables/waiters,ActorRunnable 輪詢 runnables 優先,再處理 waiters,單次 receive() 處理一條訊息,減少執行緒切換。| 庫 | 特色 | 差異 |
|---|---|---|
| Akka | 功能豐富、分散式、支援同步/非同步 | 較重、需 Scala/Java API、自有執行緒模型 |
| GPars | Groovy 整合、資料流、STM | Groovy 為主、Java 用法受限 |
| μJavaActors | 純 Java、極輕量、POJT(Plain Old Java Threads) | 無位元組碼操作、單一 JAR、易嵌入 |