多线程设计模式总结(三)

2014/07/04

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

接上一篇《多线程设计模式总结(二)》,这篇博客再聊一下最复杂的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

类图如下图所示(请点击看大图):

active_object

这是一个非常复杂的模式,ActiveObject接口里的每个方法对应MethodRequest的一个子类,每个方法的参数对应着MethodRequest的一个字段,因为ActiveObject的某些方法有返回值,故此设计了Result抽象类,表示返回值,为了让调用和执行分离,这里使用了Future模式,故此设计了三个类,Result,FutureResult,RealResult。

也是为了分离调用和执行,还使用了生产者消费者模式,将调用转化为请求对象放到ActivationQueue里,由SchedulerThread实例从ActivationQueue里不断取出请求对象,并执行。

适用场景:

这个设计模式非常复杂,是否合适要考虑问题的规模,只有大规模的问题才适合使用该模式。

注意事项:

因为这个设计模式非常复杂,故此我们在使用时,一定注意各个对象的方法由哪些线程调用。比如Proxy对象的方法可能被多个线程同时调用,而Servant对象被封闭在Scheduler线程里,只有SchedulerThread线程才会调用它的方法,故此它是线程安全的,而RealResult可能会被多个线程使用,但它是Immutable的,FutureResult可能被多个线程同时调用,它封装了两个字段,故此需要使用synchronized保护,并且是采用Guarded Suspension模式保护FutureResult。

¥打赏5毛

取消

感谢您的支持,我会继续努力的!

扫码支持
赏个5毛,支持我把

打开支付宝扫一扫,即可进行扫码打赏哦

本篇目录