1. 什么是主动对象?
参见《上篇:ACE技术论文集》第6章 和《ACE 程序员指南》第15章 归纳如下:
Active object(主动对象)模式是一种专门设计的模式,该模式使方法执行与方法调用去耦合,以简化对驻留在它自己的线程控制中的对象的同步访问。该模式以这样的需求为基础:两个主动对象应该能通过看起来像是常规方法调用的方法进行通信,但这些方法将在接受者的上下文、而不是调用者的上下文中执行。
本人自己的认识总结如下:
每个主动对象都拥有自己私有的控制线程(如果,没有调用主动对象的某个方法,该线程是阻塞的),该线程用于执行客户在这个对象上调用的任何方法.也就是说,当客户端在当前的线程中调用主动对象的某个方法时,主动对象会在自己拥有的线程中根据请求方法异步执行,最后将结果返回给客户端.这样就将调用与执行分开,客户端不会阻塞在调用方法处,同时,主动对象会根据自己的策略,在自己的线程里完成执行工作."主动对象"的叫法就是这么来的.其使用效果就跟异步通信类似:不用一直等返回结果.总的一句话就是:主动对象实现了方法的异步执行.
2.主动对象是怎么实现的?
主动对象(active object) 使用了 代理模式和命令模式(参见 GOF 常见设计模式),此模式由下面几个类组成:
代理(proxy)类
客户通过代理发出请求.代理类把方法的调用,转换成方法的请求,并把转换得到的方法请求插入激活队列中.同时,此类保存了一个仆人类对象的引用.之所以叫仆人类,是因为这个类是干活的,完成功能需求的.具体可参见 代理模式.
方法请求(method requst)
以对象的形式封装方法调用的对象,此类保存一个仆人类对象的引用.通过此类,代理类将客户的请求转换成方法请求.方法请求(method requst) 主要是采用 命令模式.
调度者(scheduler)
调度者类拥有一个指向激活队列的引用,主动对象所使用的私有控制线程会在这个队列上保持阻塞,直到有新的方法请求到达.该私有线程会苏醒过来,从激活队列中取出请求,然后执行它.这里,所说的私有线程就是方法的执行线程,不同于方法的调用线程.
激活队列(activation queue)
调度者类持有的优先级队列.所有的方法请求都由代理类对象放在这个队列中,并优主动对象的私有线程拾取.
仆人类(servant)
方法的具体实现者,与线程管理的细节没有关系.
期货(future)和期货观察者(future observer)
期货就是返回给客户一个调用方法的"结果",客户端可以通过期货获取异步操作结果.期货观察者就是与期货相关联的一个回调对象.