傳統 Java 多線程模型下,高並發意味著大量線程創建與切換開銷。協程(Coroutine)讓任務主動釋放線程(如 IO 等待時),由用戶態調度器切換任務,大幅降低內核切換成本,理論上能支撐百萬級並發。Java 語言層面暫未原生支持(Java 7 曾有實驗版),當前主流方案:Scala Actor、Kilim 框架。
輕量級 Java Thread,繼承 Actor 實現 act(),start() 啟動。異於 Thread,可接收外部消息處理。
actor ! Msg // 異步,發即返
actor !! Msg // Future,阻塞等待結果
val ft = actor !! Msg
val result = ft() // 無限等待
val results = awaitAll(500, ft1, ft2) // 限時等待多個
val results = awaitEither(ft1, ft2) // 等待任意一個
接收端用 reply(result) 返回 Future 結果。
receive { case Msg(args) => handle(args) } // 阻塞 Java 線程
react { case Msg(args) => handle(args) } // 僅阻塞 Actor,釋放 Java 線程(推薦)
react 不支持返回值,但能充分發揮協程優勢。均支持限時版 receiveWithin/reactWithin,超時匹配 case TIMEOUT。
class Processor extends Actor {
def act() {
loop {
react {
case command: String => doHandle(command)
}
}
}
def doHandle(command: String) { /* 業務邏輯 */ }
}
基於字節碼增強(織入)實現協程,提供 Task 基類,通過 pause() 釋放線程。需專用編譯器 kilim.tools.Weaver 處理類文件。性能極佳,但部署較繁瑣。