Active Object 模式是Command模式的一種,是實(shí)現(xiàn)多線程控制的一項(xiàng)古老技術(shù) .
在《敏捷軟件開發(fā)》這本書中描述的算法如下:
1、構(gòu)造一個(gè)命令。(實(shí)現(xiàn)Command模式的一個(gè)命令)
2、將該命令放入
Active Object Engine(也就是放入一個(gè)隊(duì)列,LinkedList)
3、從該Engine取出一個(gè)命令,執(zhí)行,若該命令沒有執(zhí)行過,設(shè)為執(zhí)行過,然后將自己加入隊(duì)列尾部,若執(zhí)行過,判斷該命令執(zhí)行需要的事件發(fā)生沒有,未發(fā)生,再將自己加入隊(duì)列尾部。事件發(fā)生了,將需要執(zhí)行的命令加入隊(duì)列尾部。
Active Object模式不屬于《Design Pattern》23模式。實(shí)際上,她是一種特殊的Command Queue。其特殊之處在于:
1. 隊(duì)列的擁有者會(huì)順序地執(zhí)行隊(duì)列中所有Command對(duì)象的Execute方法。(這個(gè)其實(shí)不算特殊)
2.Command對(duì)象在自己的Execute方法結(jié)束前,可以把一個(gè)新的command對(duì)象(實(shí)際上常常是這個(gè)command對(duì)象自己)再加到隊(duì)列的尾部。
看出來了嗎,這個(gè)隊(duì)列有可能不會(huì)終止的,他可以一直執(zhí)行下去。這個(gè)可以作為一個(gè)應(yīng)用或者服務(wù)的主模塊了,想像一下她可以作多少事情吧。
《ASP》指出這個(gè)模式可以用來在一個(gè)線程中處理多任務(wù)的問題!!! ^_^ 太cool了。
如何處理呢?你可以把每個(gè)command對(duì)象看作是一個(gè)任務(wù)。他在Execute函數(shù)中,處理自己的任務(wù),在任務(wù)告一段落時(shí),記錄自己的狀態(tài),然后把自己插入到隊(duì)列的尾部,結(jié)束Execute方法。當(dāng)隊(duì)列輪完一周后,又會(huì)再次執(zhí)行這個(gè)command對(duì)象的Execute方法。 ^_^ 很cool吧。
那么這種方法和多線程的方法相比有什么有缺點(diǎn)呢?
最大的優(yōu)點(diǎn)是,所有的command都在同一個(gè)線程中,因此切換時(shí),不需要進(jìn)入內(nèi)核模式!!超高效啊!!而且,可以有很多很多的command,數(shù)量上遠(yuǎn)遠(yuǎn)超過多線程的數(shù)量。
缺點(diǎn)嘛,是這種方法需要用戶自己來實(shí)現(xiàn)調(diào)度,另外這其實(shí)是一種非剝奪模式的多任務(wù),如果command處理不好,就會(huì)連累其它所有的command,因此實(shí)際上比多線程要更復(fù)雜。(嘿嘿,程序員能夠怕麻煩嗎?)
還有一點(diǎn),Active Object運(yùn)行于單線程,也就是說,她不能享受多處理器或多處理器核心帶來的性能上的改善。
其實(shí),這最后一點(diǎn)是非常致命的一點(diǎn)。也就是說,在當(dāng)前intel的超線程CPU機(jī)器上,如果系統(tǒng)的負(fù)擔(dān)并不重的時(shí)候。Active Object的效率有可能比多線程更低。
posted on 2012-07-11 08:14
王海光 閱讀(816)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Design Pattern