码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-01 20:21:18      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://www.cnblogs.com/chenying99/p/4265968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!