==========================Active Object Pattern========================================
Active Object 模式是Command模式的一種,是實現多線程式控制制的一項古老技術 .
在《敏捷式軟體開發 (Agile Software Development)》這本書中描述的演算法如下:
1、構造一個命令。(實現Command模式的一個命令)
2、將該命令放入Active Object Engine(也就是放入一個隊列,LinkedList)
3、從該Engine取出一個命令,執行,若該命令沒有執行過,設為執行過,然後將自己排入佇列尾部,若執行過,判斷該命令執行需要的事件發生沒有,未發生,再將自己排入佇列尾部。事件發生了,將需要執行的命令排入佇列尾部。
那麼到底什麼是主動對象呢?傳統上,所有的對象都是被動的程式碼片段,對象中的代碼是在對它發出方法調用的線程中執行的。也就是,調用線程(calling threads)被“借出”,以執行被動對象的方法。
而主動對象卻不一樣。這些對象持有它們自己的線程(甚或多個線程),並將這個線程用於執行對它們的任何方法的調用。因而,如果你想象一個傳統對象,在裡面封裝了一個線程(或多個線程),你就得到了一個主動對象。
例如,設想對象“A”已在你的程式的main()函數中被執行個體化。當你的程式啟動時,OS建立一個線程,以從main()函數開始執行。如果你調用對象A的任何方法,該線程將“流過”那個方法,並執行其中的代碼。一旦執行完成,該線程返回調用該方法的點並繼續它的執行。但是,如果”A”是主動對象,事情就不是這樣了。在這種情況下,主線程不會被主動對象借用。相反,當”A”的方法被調用時,方法的執行發生在主動對象持有的線程中。另一種思考方法:如果調用的是被動對象的方法(常規對象),調用會阻塞(同步的);而另一方面,如果調用的是主動對象的方法,調用不會阻塞(非同步)。
此設計模式也比較複雜,可參見ACE的中文文檔裡面的一篇文章:主動對象(Active Object):用於並發編程的對象行為模式 (http://www.kuqin.com/ace-2002-12/Part-One/Chapter-6.htm)