接上一篇《多线程设计模式总结(二)》,这篇博客再聊一下最复杂的Active Object模式
12)Active Object
Active Object模式,也称为Actor模式。Active Object即主动对象,它不仅拥有独立线程,并且可以从外部接收异步消息,并能配合需要返回处理结果。这里的Active Object不是指一个对象,而是指将一群对象组织起来,对外表现为一个整体,这个整体拥有独立线程,并能接收外部的异步消息,这个整体(Active Object)处理完异步消息后还可以返回结果给调用者。
Future Pattern也能接收异步消息并返回处理结果,但是该模式聚焦在Future上,不是很关注线程主动执行方面,而Activie Object将独立线程,接收异步消息并返回处理结果这些方面看作一个整体。Active Object模式综合利用了先前介绍的Producer-Consumer模式,Thread-Per-Message模式,Future模式等多线程设计模式。
示例程序:
代码可上github下载: https://github.com/cloudchou/Multithread_ActiveObject
类图如下图所示(请点击看大图):
这是一个非常复杂的模式,ActiveObject接口里的每个方法对应MethodRequest的一个子类,每个方法的参数对应着MethodRequest的一个字段,因为ActiveObject的某些方法有返回值,故此设计了Result抽象类,表示返回值,为了让调用和执行分离,这里使用了Future模式,故此设计了三个类,Result,FutureResult,RealResult。
也是为了分离调用和执行,还使用了生产者消费者模式,将调用转化为请求对象放到ActivationQueue里,由SchedulerThread实例从ActivationQueue里不断取出请求对象,并执行。
适用场景:
这个设计模式非常复杂,是否合适要考虑问题的规模,只有大规模的问题才适合使用该模式。
注意事项:
因为这个设计模式非常复杂,故此我们在使用时,一定注意各个对象的方法由哪些线程调用。比如Proxy对象的方法可能被多个线程同时调用,而Servant对象被封闭在Scheduler线程里,只有SchedulerThread线程才会调用它的方法,故此它是线程安全的,而RealResult可能会被多个线程使用,但它是Immutable的,FutureResult可能被多个线程同时调用,它封装了两个字段,故此需要使用synchronized保护,并且是采用Guarded Suspension模式保护FutureResult。
转载 http://www.cloudchou.com/softdesign/post-620.html