技术开发 频道

构架Java并发模型框架


IT168技术文档】 
    基于框架的解决方案
本小节将使用上述的框架重新实现前面的例子,提供对于并发的支持。第一步先完成对于MethodRequest的实现,对于我们的例子来说实现如下:
class SayHello implements MethodRequest { public SayHello(Service s) { _service = s; } public void call() { _service.sayHello(); } private Service _service; }
该类完成了对于服务提供接口sayHello方法的封装。接下来定义一个服务代理类,来完成请求的封装、排队功能,当然为了做到对Client透明,该类必须实现Service接口。定义如下:
class ServiceProxy implements Service { public ServiceProxy() { _service = new ServiceImp(); _active_object = new ActiveObject(); } public void sayHello() { MethodRequest mr = new SayHello(_service); _active_object.enqueue(mr); } private Service _service; private ActiveObject _active_object; }
其他的类和接口定义不变,下面对比一下并发逻辑增加前后的服务调用的变化,并发逻辑增加前,对于sayHello服务的调用方法:
Service s = new ServiceImp(); Client c = new Client(s); c.requestService();
并发逻辑增加后,对于sayHello服务的调用方法:
Service s = new ServiceProxy(); Client c = new Client(s); c.requestService();
可以看出并发逻辑增加前后对于Client的ServiceImp都无需作任何改变,使用方式也非常一致,ServiceImp也能够独立的进行重用。类结构图如下:


读者容易看出,使用框架也增加了一些复杂性,对于一些简单的应用来说可能根本就没有必要使用本框架。希望读者能够根据自己的实际情况进行判断。

结论
本文围绕一个简单的例子论述了如何构架一个Java并发模型框架,其中使用了一些构建框架的常用技术,当然所构建的框架和一些成熟的商用框架相比,显得非常稚嫩,比如没有考虑服务调用有返回值的情况,但是其思想方法是一致的,希望读者能够深加领会,这样无论对于构建自己的框架还是理解一些其他的框架都是很有帮助的。读者可以对本文中的框架进行扩充,直接应用到自己的工作中。参考文献〔1〕中对于构建并发模型框架中的很多细节问题进行了深入的论述,有兴趣的读者可以自行研究。下面列出本框架的优缺点:

优点:
增强了应用的并发性,简化了同步控制的复杂性

服务的请求和服务的执行分离,使得可以对服务请求排队,进行灵活的控制

应用逻辑和并发模型分离,使得程序结构清晰,易于维护、重用

可以使开发者集中精力于应用领域


缺点:
由于框架所需类的存在,在一定程度上增加了程序的复杂性

如果应用需要过多的活动对象,由于线程切换开销会造成性能下降

可能会造成调试困难


参考文献
[1] Active Object An Object Behavioral Pattern for Concurrent, Schmidt, Douglass, Lavender, R. Greg, Programming,http://www.cs.wustl.edu/~schmidt/PDF/Act-Obj.pdf
本站下载
[2] Effective Java Programming Language Guide, Joshua Bloch

[3] Double-checked locking: Clever, but broken, Brian Goetz, http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.htm

[4] Design Patterns, Gamma, et. al., Addison Wesley

0
相关文章