並發對象:方法調用與執行分離於不同線程的對象,即方法異步執行。這是面向對象概念在多線程環境下的自然延伸。
Active Object 模式本質:解耦方法調用與執行。調用發生在客戶端線程,執行發生在專屬的 Active Object 線程。對調用者透明,如同調用普通對象方法。
canRun()(同步守衛條件)與 call()(綁定執行邏輯)。call() 執行。Proxy.get() → Proxy 創建 Get Request → Scheduler insert() 入隊 → 返回 Message_Future(步驟 1-6,調用者線程)。canRun() 判斷守衛條件(如隊列非空) → 滿足則 remove() 出隊 → call() 執行 Servant.get() → 結果存入 Future → 刪除 Request(步驟 7-12,Active Object 線程)。future.result() 同步/超時/異步獲取結果。// Proxy 入口
void put(Message msg) { scheduler.insert(new Put(servant, msg)); }
Message_Future get() {
Message_Future f;
scheduler.insert(new Get(&servant, f));
return f;
}
// Method Request 守衛條件
class Get extends Method_Request {
bool can_run() const { return !servant->empty(); } // 隊列非空才能取
void call() { result = servant->get(); }
}
// Scheduler 調度循環
void dispatch() {
for (;;) {
for (request = act_list.begin(); request != act_list.end(); ++request) {
if ((*request).can_run()) {
act_list.remove(*request);
(*request).call();
delete *request;
}
}
}
}
JDK 1.3 引入,單線程執行導致任務調度不精確,長任務阻塞後續任務。Java 5+ 推薦使用 ScheduledThreadPoolExecutor 替代。
Java 5 java.util.concurrent.Executor 框架是 Active Object 模式的標準化實現,但極大簡化了角色分工:
run()/call() 直接包含業務邏輯。Future 接口,支持結果獲取、取消、狀態查詢。executor.execute(task) 或 submit(task),並發細節暴露給調用者。// Active Object 風格(隱藏並發細節)
MQ_Proxy queue;
Message_Future f = queue.get();
Message msg = f.result(); // 像調用普通方法
// Executor 風格(顯式提交任務)
Executor exec = Executors.newFixedThreadPool(100);
Future<Message> f = exec.submit(() -> {
return handleRequest(connection); // 業務邏輯在 Task 內
});
Message msg = f.get();
| 維度 | Active Object 完整模式 | Executor Framework |
|---|---|---|
| 並發細節封裝 | 完全隱藏,調用如同普通對象 | 暴露任務提交模型,調用者感知並發 |
| 靈活性/控制力 | 高(自定義調度策略、守衛條件、優先級) | 中(依賴 ThreadPoolExecutor 策略配置) |
| 開發複雜度 | 高(需實現六大角色、同步機制) | 低(標準 API,開箱即用) |
| 適用場景 | 領域模型驅動、需透明並發、複雜同步約束 | 任務並行處理、服務端請求分發、批量異步作業 |
Active Object 是並發編程的經典模式,Java Executor Framework 將其工業化、標準化。理解底層 C++ 實現機制(Proxy、Activation List、Scheduler、Servant、Future、Method Request),有助於在 Java 中正確選擇:需領域透明並發時自建 Active Object;需高吞吐任務處理時直接用 Executor。兩者同源異流,核心皆是「調用與執行分離」。