快速业务通道

Active Object并发模式在Java中的应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
的,等待执行的方法请求。从运行时来看,Activation List 会被包括调用者线程及其 Active Object 线程并发存取访问,所以,Activation List 实现应当是 线程安全的。

调度者 (Scheduler):调度者运行在 Active Object 线程中,调度者来决定下一个执行的方法请求, 而调度策略可以基于很多种标准,比如根据方法请求被插入的顺序 FIFO 或者 LIFO,比如根据方法请求 的优先级等等。

Servant: Servant 定义了 Active Object 的行为和状态,它是 Proxy 所定义的接口的事实实现。

Future: 调用者调用 Proxy 所定义的方法,获得 Future 对象。调用者可以从该 Future 对象获得方 法执行的最终结果。在真实的实现里,Future 对象会保留一个私有的空间,用来存放 Servant 方法执行 的结果。

执行序列图

在 Active Object 设计模式中,在参与者之间将发生如下的协作过程:

方法请求的构造与调度。调用者调用 Proxy 的方法 method(),Proxy 创建相应的方法请求,把它传 给调度者 (Scheduler),调度者负责把该方法请求放入 Activation List 中。如果 method() 需要返回 执行结果,Proxy 返回一个 Future 对象给调用者(图 1 中步骤 1 到步骤 6)。

方法请求执行。调度者负责从 Activation List 队列里按照预先定义的规则拿出下一个可执行的方法 请求,并把该请求绑定到相应 Servant 所定义的方法(图 1 中步骤 7 到步骤 11)。

完成阶段。保存任何 Servant 方法执行的结果到 Future 对象中去(图 1 中步骤 12)。重复第二步 ,调度者继续轮询 Activation List 队列,看是否有下一个可执行的方法请求。

图 1. Active Object Sequence Diagram.

从图 1 我们可以看到,步骤 1 到步骤 6 运行在调用者线程中,而步骤 7 到步骤 12 运行在 Active Object 的线程中。

Active Object并发模式在Java中的应用(3)

时间:2011-10-22 IBM 李三红

实现

在本节中,我们给出 Active Object 的 C++ 示例实现。

调用者调用 Proxy 的 get() 方法,从 Active Object 获得 Message。我们可以假定,在真实的应用 中, get() 方法的实现受制于某些慢速的 IO 操作,比如需要通过 TCP Socket 从远端的机器获得 Message, 然后返回给调用者。所以我们使用 Active Object 来实现该应用,通过线程的并发达到提高应 用的 QoS。

实现 Servant,如清单 1 所示:

清单 1. MQ_Servant

class MQ_Servant { public:    // Constructor and destructor.    MQ_Servant (size_t mq_size);    virtual ~MQ_Servant ();    // Message queue implementation operations.    void put (const Message &msg);    Message get ();     // Predicates.    bool empty () const;    bool full () const; private:    // Internal queue representation, e.g., a circular    // array or a linked list, that does not use any    // internal synchronization mechanism. };

MQ_Servant 是真正的服务提供者,实现了 Proxy 中定义的方法。put() 和 get() 方法用来操作底层 的队列。另外,Servant 的实现是纯粹的应用逻辑实现,或者称为商业逻辑实现,没有混合任何的线程同 步机制 , 这有利于我们进行应用逻辑的重用,而不需要考虑不同的线程同步机制。

实现 Proxy,如清单 2 所示:

清单 2. MQ_Proxy

class MQ_Proxy { public:    // Bound the message queue size.    enum { MQ_MAX_SIZE = 100 };    MQ_Proxy (size_t size = MQ_MAX_SIZE)    :scheduler_ (size),    servant_ (size) {    }    // Schedule <put> to execute on the activ

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号