5.1 主動對象
那么到底什么是主動對象呢?傳統上,所有的對象都是被動的代碼段,對象中的代碼是在對它發出方法調用的線程中執行的。也就是,調用線程(
calling threads)被“借出”,以執行被動對象的方法。
而主動對象卻不一樣。這些對象持有它們自己的線程(甚或多個線程),并將這個線程用于執行對它們的任何方法的調用。因而,如果你想象一個傳統對象,在里面封裝了一個線程(或多個線程),你就得到了一個主動對象。
例如,設想對象
“A”已在你的程序的main()函數中被實例化。當你的程序啟動時,OS創建一個線程,以從main()函數開始執行。如果你調用對象A的任何方法,該線程將“流過”那個方法,并執行其中的代碼。一旦執行完成,該線程返回調用該方法的點并繼續它的執行。但是,如果”A”是主動對象,事情就不是這樣了。在這種情況下,主線程不會被主動對象借用。相反,當”A”的方法被調用時,方法的執行發生在主動對象持有的線程中。另一種思考方法:如果調用的是被動對象的方法(常規對象),調用會阻塞(同步的);而另一方面,如果調用的是主動對象的方法,調用不會阻塞(異步的)。