Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并发设计模式实战系列(8):Active Object

并发设计模式实战系列(8):Active Object

作者头像
摘星.
发布于 2025-05-20 06:48:13
发布于 2025-05-20 06:48:13
13400
代码可运行
举报
文章被收录于专栏:博客专享博客专享
运行总次数:0
代码可运行
🌟 大家好,我是摘星! 🌟

今天为大家带来的是并发设计模式实战系列,第8章Active Object,废话不多说直接开始~

一、核心原理深度拆解

1. 对象与执行解耦架构
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌───────────────┐    ┌─────────────────┐    ┌───────────────┐
│   Client       │    │   Method Request │    │   Scheduler    │
 (同步调用接口)  │───> (方法封装对象)    │───> (任务调度器)   │
└───────────────┘    └─────────────────┘    └───────────────┘
       ▲                                         │
       │                                         ▼
       │                                  ┌───────────────┐
       └─────────────────────────────────│   Servant      │
                                          (实际执行体)   │
                                         └───────────────┘
2. 核心组件
  • Proxy:提供与普通对象相同的接口,将方法调用转为Method Request对象
  • Method Request:封装方法调用信息(命令模式)
  • Scheduler:维护请求队列,按策略调度执行(通常基于线程池)
  • Servant:实际执行业务逻辑的对象
  • Future:异步返回结果的占位符

二、生活化类比:餐厅订餐系统

系统组件

现实类比

核心行为

Client

顾客

下单但不参与烹饪过程

Proxy

服务员

接收订单并转交后厨

Scheduler

厨师长

安排厨师处理订单队列

Servant

厨师团队

实际烹饪操作

Future

取餐号码牌

凭此后续获取菜品

  • 异步流程:顾客下单 → 服务员记录 → 订单进入队列 → 厨师按序处理 → 完成通知

三、Java代码实现(生产级Demo)

1. 完整可运行代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.concurrent.*;

// 1. 定义业务接口
interface MyService {
    Future<String> process(String data) throws InterruptedException;
}

// 2. 实现Servant(实际执行体)
class MyServant implements MyService {
    @Override
    public String doProcess(String data) throws InterruptedException {
        Thread.sleep(1000); // 模拟耗时操作
        return "Processed: " + data.toUpperCase();
    }
}

// 3. 方法请求封装(Command模式)
class MethodRequest implements Callable<String> {
    private final MyServant servant;
    private final String data;

    public MethodRequest(MyServant servant, String data) {
        this.servant = servant;
        this.data = data;
    }

    @Override
    public String call() throws Exception {
        return servant.doProcess(data);
    }
}

// 4. Active Object代理
class MyServiceProxy implements MyService {
    private final ExecutorService scheduler = 
        Executors.newSingleThreadExecutor(); // 可替换为线程池
    
    private final MyServant servant = new MyServant();

    @Override
    public Future<String> process(String data) {
        System.out.println("[Proxy] 接收请求: " + data);
        Future<String> future = scheduler.submit(new MethodRequest(servant, data));
        System.out.println("[Proxy] 已提交任务队列");
        return future;
    }

    public void shutdown() {
        scheduler.shutdown();
    }
}

// 5. 客户端使用
public class ActiveObjectDemo {
    public static void main(String[] args) throws Exception {
        MyService service = new MyServiceProxy();
        
        // 异步调用
        Future<String> future1 = service.process("hello");
        Future<String> future2 = service.process("world");

        System.out.println("[Client] 提交任务后立即继续其他操作...");
        
        // 获取结果(阻塞直到完成)
        System.out.println("[Client] 结果1: " + future1.get());
        System.out.println("[Client] 结果2: " + future2.get());

        ((MyServiceProxy)service).shutdown();
    }
}
2. 关键配置说明
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 调度器优化:使用带容量的线程池
ThreadPoolExecutor scheduler = new ThreadPoolExecutor(
    1, // 核心线程
    4, // 最大线程
    30, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(100), // 防止无限制堆积
    new ThreadPoolExecutor.CallerRunsPolicy()
);

// Future增强:使用CompletableFuture
public Future<String> process(String data) {
    CompletableFuture<String> future = new CompletableFuture<>();
    scheduler.execute(() -> {
        try {
            String result = servant.doProcess(data);
            future.complete(result);
        } catch (Exception e) {
            future.completeExceptionally(e);
        }
    });
    return future;
}

四、横向对比表格

1. 并发模式对比

模式

线程管理

调用方式

适用场景

Active Object

集中调度

异步调用

需要方法调用顺序控制

Half-Sync/Half-Async

分层管理

混合调用

高并发I/O+阻塞任务混合

Thread-Per-Request

每次新建线程

同步调用

简单短任务

Reactor

事件驱动

非阻塞

纯高并发网络I/O处理

2. 任务队列策略对比

特性

Active Object

普通线程池

调用控制

方法级封装

Runnable/Callable

顺序保证

严格队列顺序

可配置优先级

异常处理

通过Future获取

自行捕获处理

资源管理

集中调度可控

依赖线程池配置


五、高级优化技巧

1. 优先级调度实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class PriorityMethodRequest implements Comparable<PriorityMethodRequest>, Callable<String> {
    private int priority; // 优先级字段
    
    @Override
    public int compareTo(PriorityMethodRequest o) {
        return Integer.compare(o.priority, this.priority);
    }
}

// 使用PriorityBlockingQueue
ThreadPoolExecutor scheduler = new ThreadPoolExecutor(
    1, 4, 30, TimeUnit.SECONDS,
    new PriorityBlockingQueue<>(100)
);
2. 方法调用超时控制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Future<String> future = service.process("data");
try {
    String result = future.get(2, TimeUnit.SECONDS); // 设置超时
} catch (TimeoutException e) {
    future.cancel(true); // 取消任务
}
3. 性能监控指标
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 监控队列积压
int queueSize = ((ThreadPoolExecutor)scheduler).getQueue().size();

// 跟踪方法执行时间
long start = System.nanoTime();
String result = servant.doProcess(data);
long duration = System.nanoTime() - start;

六、模式变体与扩展应用

1. 多线程Active Object变体
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 扩展为多消费者线程池
class MultiThreadActiveObject implements MyService {
    private final ExecutorService scheduler = 
        Executors.newFixedThreadPool(4); // 多线程调度
    
    // ...其余实现与单线程版本相同...
}

// 适用场景:CPU密集型任务处理
2. 事件驱动融合方案
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌───────────────┐    ┌─────────────────┐    ┌───────────────┐
│   Event        │    │   Active Object   │    │   Reactor     │
│   Producer     │───>   (带队列缓冲)    │───>   (非阻塞I/O) │
└───────────────┘    └─────────────────┘    └───────────────┘
  • 组合优势:突发流量缓冲 + 高效I/O处理
  • 实现要点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class EventDrivenActiveObject {
    private final BlockingQueue<Event> eventQueue = new LinkedBlockingQueue<>();
    private final Reactor reactor = new Reactor();
    
    public void onEvent(Event event) {
        eventQueue.offer(event);
    }
    
    private void processEvents() {
        while (true) {
            Event event = eventQueue.take();
            reactor.handleEvent(event); // 转交Reactor处理
        }
    }
}

七、生产环境最佳实践

1. 异常处理增强方案
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class RobustMethodRequest implements Callable<String> {
    @Override
    public String call() {
        try {
            return servant.doProcess(data);
        } catch (Exception e) {
            // 1. 记录详细上下文信息
            // 2. 触发补偿机制
            // 3. 返回兜底结果
            return "FallbackResult";
        }
    }
}

// 使用装饰器模式统一处理
public Future<String> process(String data) {
    FutureTask<String> task = new FutureTask<>(
        new ExceptionHandlingDecorator(
            new MethodRequest(servant, data)
        )
    );
    scheduler.execute(task);
    return task;
}
2. 动态降级策略
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 根据系统负载动态调整
class AdaptiveScheduler {
    private final ThreadPoolExecutor executor;
    
    public void adjustPoolSize() {
        if (systemOverloaded()) {
            executor.setCorePoolSize(2); // 降级处理
        } else {
            executor.setCorePoolSize(8); // 正常处理
        }
    }
    
    private boolean systemOverloaded() {
        return executor.getQueue().size() > 50 
               || SystemLoadAverage() > 2.0;
    }
}

八、性能调优指南

1. 关键参数配置矩阵

参数

低负载场景

高并发场景

计算密集型场景

核心线程数

CPU核数

CPU核数×2

CPU核数+1

队列容量

100-500

1000-5000

100-200

拒绝策略

CallerRuns

DiscardOldest

AbortPolicy

优先级策略

关闭

业务分级启用

计算优先级启用

2. 监控指标看板
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过JMX暴露关键指标
class ActiveObjectMetrics implements ActiveObjectMetricsMBean {
    public int getQueueSize() {
        return executor.getQueue().size();
    }
    
    public double getAvgProcessTime() {
        return timer.getMeanRate();
    }
}

// 注册MBean
ManagementFactory.getPlatformMBeanServer()
    .registerMBean(new ActiveObjectMetrics(), name);

九、常见陷阱与规避方案

1. 死锁场景分析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌───────────────┐        ┌───────────────┐
│  Client Thread │        │  Active Object │
   (持有锁A)  (等待锁B)     │
│   request1()   │───────>│  正在执行      │
└───────────────┘        └───────────────┘
    ↑                         ↑
    │  request2()需要锁B      │ 需要锁A继续执行
    └─────────────────────────┘

解决方案

  • 避免在Servant方法中调用其他Active Object
  • 使用超时获取锁:lock.tryLock(100, TimeUnit.MILLISECONDS)
2. 内存泄漏防范
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 弱引用持有Future
private final Map<Future<?>, WeakReference<Context>> contextMap = 
    new ConcurrentHashMap<>();

// 定期清理已完成任务
scheduler.scheduleAtFixedRate(() -> {
    contextMap.entrySet().removeIf(e -> 
        e.getKey().isDone() || e.getValue().get() == null
    );
}, 1, 1, TimeUnit.HOURS);

十、行业应用案例

1. 金融交易系统实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌───────────────────────┐
│  订单接收 (Active Object) │
├───────────────────────┤
│ 1. 验证请求合法性        │
│ 2. 生成交易流水号        │
│ 3. 进入风险控制队列      │
└───────────────┬───────┘
                ↓
┌───────────────────────┐
│  风控处理 (优先级队列)    │
├───────────────────────┤
│ • VIP客户优先处理       │
│ • 黑名单实时拦截         │
└───────────────────────┘
2. 物联网设备管理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DeviceManagerProxy implements DeviceAPI {
    // 设备命令按优先级处理
    private final PriorityBlockingQueue<Command> queue;
    
    public Future<Result> sendCommand(Device device, Command cmd) {
        HighPriorityCommand wrappedCmd = 
            new HighPriorityCommand(device, cmd);
        return scheduler.submit(wrappedCmd);
    }
    
    private class HighPriorityCommand implements Comparable<HighPriorityCommand> {
        // 根据设备类型设置优先级
        public int compareTo(HighPriorityCommand o) {
            return this.device.isCritical() ? 1 : -1;
        }
    }
}

通过这十个维度的系统化解析,Active Object模式可覆盖从基础实现到高级优化的全场景需求。关键点总结:

  1. 解耦价值:分离方法调用与执行
  2. 调度控制:通过队列实现流量整形
  3. 扩展能力:支持优先级/超时等企业级需求
  4. 行业适配:可根据领域特性定制变体
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
并发设计模式实战系列(1):半同步/半异步模式
今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
摘星.
2025/05/20
820
并发设计模式实战系列(5):生产者/消费者
今天为大家带来的是并发设计模式实战系列,第五章生产者/消费者模式​​,废话不多说直接开始~
摘星.
2025/05/20
1340
并发设计模式实战系列(5):生产者/消费者
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
今天为大家带来的是并发设计模式实战系列,第二十章扇出/扇入模式(Fan-Out/Fan-In),废话不多说直接开始~
摘星.
2025/05/20
1170
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
并发设计模式实战系列(10):Balking(犹豫模式)
今天为大家带来的是并发设计模式实战系列,第10章Balking(犹豫模式),废话不多说直接开始~
摘星.
2025/05/20
890
并发设计模式实战系列(18):反应器(Reactor)
今天为大家带来的是并发设计模式实战系列,第十八章反应器(Reactor),废话不多说直接开始~
摘星.
2025/05/20
950
并发设计模式实战系列(18):反应器(Reactor)
并发设计模式实战系列(3):工作队列
今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue)​​,废话不多说直接开始~
摘星.
2025/05/20
1550
并发设计模式实战系列(9):消息传递(Message Passing)
今天为大家带来的是并发设计模式实战系列,第九章消息传递(Message Passing),废话不多说直接开始~
摘星.
2025/05/20
1270
并发设计模式实战系列(9):消息传递(Message Passing)
并发设计模式实战系列(19):监视器(Monitor)
今天为大家带来的是并发设计模式实战系列,第十九章监视器(Monitor),废话不多说直接开始~
摘星.
2025/05/20
960
并发设计模式实战系列(4):线程池
今天为大家带来的是并发设计模式实战系列,第四章线程池(Thread Pool)​,废话不多说直接开始~
摘星.
2025/05/20
1460
并发设计模式实战系列(2):领导者/追随者模式
今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
摘星.
2025/05/20
530
并发设计模式实战系列(6):读写锁
今天为大家带来的是并发设计模式实战系列,第六章读写锁模式​​,废话不多说直接开始~
摘星.
2025/05/20
920
并发设计模式实战系列(6):读写锁
[从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务
SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。
罗西的思考
2020/12/22
5770
设计模式学习之代理模式
代理模式,可以分为两种,一种是静态代理,一种是动态代理。 两种代理从虚拟机加载类的角度来讲,本质上都是一样的,都是在原有类的行为基础上,加入一些多出的行为,甚至完全替换原有的行为。在我们平时写代码的过程中,代理模式可以说是随处可见,所以,本篇博客就将给大家介绍代理模式。
老马的编程之旅
2022/06/22
4130
设计模式学习之代理模式
Java高并发之设计模式.
至于为什么要volatile关键字, 主要涉及到jdk指令重排, 详见之前的博文: Java内存模型与指令重排
用户1216491
2018/08/28
5430
Java高并发之设计模式.
Java高并发之设计模式
原文出处:http://www.yund.tech/zdetail.html?type=1&id=34e52a515cd0e4d120255c90f33396af 作者:jstarseven  本文主
大道七哥
2019/08/23
4990
Java高并发之设计模式
并发设计模式实战系列(7):Thread Local Storage (TLS)
今天为大家带来的是并发设计模式实战系列,第七章Thread Local Storage (TLS),废话不多说直接开始~
摘星.
2025/05/20
1030
并发设计模式实战系列(17):信号量(Semaphore)
今天为大家带来的是并发设计模式实战系列,第十七章信号量(Semaphore),废话不多说直接开始~
摘星.
2025/05/20
1480
浅谈 Java 并发编程中的若干核心技术
作者:一字马胡 原文:http://www.jianshu.com/p/5f499f8212e7 索引 Java线程 线程模型 Java线程池 Future(各种Future) Fork/Join框架 volatile CAS(原子操作) AQS(并发同步框架) synchronized(同步锁) 并发队列(阻塞队列) 本文仅分析java并发编程中的若干核心问题,对于上面没有提到但是又和java并发编程有密切关系的技术将会不断添加进来完善文章,本文将长期更新,不断迭代。本文试图从一个更高的视觉来总结Jav
前端教程
2018/03/05
9690
浅谈 Java 并发编程中的若干核心技术
Android中多线程切换的几种方法
我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于线程切换的实现方式。
用户1269200
2018/07/30
2K0
并发设计模式实战系列(15):Future/Promise
今天为大家带来的是并发设计模式实战系列,第十五章Future/Promise,废话不多说直接开始~
摘星.
2025/05/20
990
推荐阅读
相关推荐
并发设计模式实战系列(1):半同步/半异步模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验