快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
 {    private static final int NTHREADS = 100;    private static final Executor exec = Executors.newFixedThreadPool (NTHREADS);    public static void main(String[] args) throws IOException {      ServerSocket socket = new ServerSocket(80);      while (true) {        final Socket connection = socket.accept();        Runnable task = new Runnable() {          public void run() {            handleRequest(connection);          }          public void handleRequest(Socket connection) {            // Handle the incoming socket connection from            //individual client.          }        };        exec.execute(task);      }    } } 

在示例 8 中,我们创建了一个基于线程池的 Java Executor, 每当新的 TCP 连接进来的时候,我们 就分配一个独立的实现了 Runnable 任务来处理该连接,所有这些任务运行在我们创建的有 100 个线程 的线程池上。

我们可以从 Active Object 设计模式的角度来审视一下 Java Executor 框架。Java Executor 框架 以任务 (Task) 为中心,简化了 Active Object 中的角色分工。可以看到,实现 Runnable 或者 Callable 接口的 Java Executor 任务整合了 Method Request 和 Servant 的角色 , 通过实现 run() 或者 call() 方法实现应用逻辑。Java Executor 框架并没有显式地定义 Proxy 接口,而是直接调用 Executor 提交任务,这里的 Executor 相当于 Active Object 中调度者角色。从调用者的角度来看,这 看起来并不像是在调用一个普通对象方法,而是向 Executor 提交了一个任务。所以,在这个层面上说, 并发的底层细节已经暴露给了调用者。对于 Java 的开发者来说,如果你不担心这样的底层并发细节直接 暴露给调用者,或者说你的应用并不需要像对待普通对象一样对待并发对象,Java 的 Executor 框架是 一个很好的选择。相反,如果你希望隐藏这样的并发细节,希望像操纵普通对象一样操纵并发对象,那你 就需要如本文上节所描述的那样,遵循 Active Object 设计原则 , 清晰地定义各个角色,实现自己的 Active Object 模式。

总而言之,Java Executor 框架简化了 Active Object 所定义的模式,模糊了 Active Object 中角 色的分工,其基于生产者 / 消费者模式,生产者和消费者基于任务相互协作。

总结

最后,我们讨论一下 Active Object 设计模式的优缺点。

Active Object 给我们的应用带来的好处:

极大提高了应用的并发性以及简化了线程同步带来的复杂性。并发性的提高得益于调用者线程与 Active Object 线程的并发执行。简化的线程同步复杂性主要表现在所有线程同步细节封装在调度者内 ( 也就是 Java 的 Executor 对象 ),Active Object 调用者并不需要关心。

在 Active Object 中,方法的执行顺序可以不同于方法的调用顺序。用 Java 的话说,也就是任务执 行的顺序可以不同于任务提交的顺序。在一定情况下,这可以帮助优化我们应用的性能,提高应用的 QoS 及其 Responsiveness。在 Java Executor 框架下,你可以根据当前的计算资源,确定优化的执行策略 (Execution Policy),该执行策略的内容包括:任务将分配在多少线程上执行,以什么顺序执行,多少任 务可以同时执行等等。

当然,Active Object 也有缺点:

额外的性能开销。这涉及到从调用者线程到 Active Object 线程的上下文切换,线程同步,额外的内 存拷贝等。

难于调试。Active Object 引入了方法的异步执行,从调试者的角度看

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号