?

基于反射機制的數據流Java多態性實現及研究

2010-08-23 08:33曹大有
制造業自動化 2010年13期
關鍵詞:構造方法數據流端口

曹大有

CAO Da-you

(鄖陽師范高等??茖W校 計算機科學系,丹江口 442700)

1 數據流Java 程序設計模型[3]

1.1 傳統數據流模型

數據流模型很早就被提了出來,一般一個數據流程序由多個actor 組成。傳統的細粒度數據流模型中,actor 的粒度是一個操作,而在粗粒度的數據流模型中,actor 的粒度可以是一個函數。actor 之間只能通過先入先出的緩沖隊列進行通信。每個actor有一個相應的觸發規則(firing rule)集合,當其中某一規則滿足時,該actor被觸發,讀取輸入隊列上的數據,產生輸出數據。actor 是沒有內部狀態的,它的行為只由輸入數據和觸發規則決定。類似的模型還有進程網絡(process network)。每個進程是一小段串行程序,進程之間只能通過先入先出的緩沖隊列進行同步和通信。當一個進程讀一個空隊列或者寫一個滿隊列時,它會被阻塞,直到操作完成。

1.2 數據流Java[1,3]

在數據流和進程網絡模型中,各個運行單元之間的同步和通信是通過顯式的數據傳遞來完成的。由于禁止了運行單元之間的隱式數據共享,避免了多線程模型的數據競爭和沖突,有利于程序的形式化分析和驗證。數據流模型能夠幫助程序員自然地表達應用程序的內部并行性,減少編譯器并行化分析和優化的難度。

數據流Java中最小的獨立運行的單元叫做組件(component),它對應于我們通常的進程或線程。組件內只能串行執行。一個數據流 Java 程序可以擁有多個組件,各個組件之間可以獨立運行。

組件可以定義自己的輸入和輸出端口(port),用于和外部通信。組件之間的顯式數據通信只能通過輸入和輸出端口之間進行。通信時數據對象的發送和接收是異步的、先入先出的。當某個組件通過一個輸出端口對多個組件的普通輸入端口發送數據對象時,可以有兩種發送方式:將數據對象復制多個副本后發送到所有組件;或者以輪轉方式依次發送。如果是對多個組件的參數端口發送數據對象,那么也可以有兩種方式:將數據對象的引用發送給所有組件共享;或者以復制的方式發送。數據流 Java 采用隱式多線程模型,程序員需要知道組件運行時可能有多個副本同時運行。如果訪問參數端口傳遞的共享的數據對象,則需要保證操作是原子的。

2 基于反射機制的數據流Java多態性實現

反射是指一個系統表述和改變自身行為的能力[2],反射機制允許程序運行時動態地加載一個類,生成該對象的實例和調用該實例的方法。下面我們就以數據流多態例,利用Java提供的反射機制來實現數據流Java的多態性。

設計出Java的類Shape、Rectangle和Triangle。然后針對類繼承體系中的每一個類設計出對應的數據流Java的組件類,以類Rectangle為例,對應的數據流Java的組件類為:

下面我們就要來研究如何利用Java語言提供的反射機制來實現數據流Java多態性的組件類,該組件類類名我們就命名為PolymorphismComponent。由于在該類體系中每個類只有一個構造方法且該構造方法有兩個double型的參數,所以對組件類PolymorphismComponent的輸入參數類型設為形如"12.3,45.6,Shape"的String類型,其中12.3,45.6為構造方法提供參數,Shape為具體類名。

在組件類PolymorphismComponent的execute()方法中,首先通過輸入端口的receive()方法接收數據,然后分離出需要動態加載的類名classStr,再通過以下過程:

來動態生成對象obj,其中parts[0]和parts[1]為構造方法的參數.對象obj生成后,再通過以下條件語句進行數據的發送:

上面的條件語句實際上是在組件類PolymorphismComponent中維護了一個稱之為分派樹(dispatch tree)的數據結構,分派樹在運行時構建網絡的時候創建。輸入端口類型必須是輸出端口類型本身或者其子類,一個類型只允許有一個端口。運行時,系統根據類的層次關系建立一個反向的樹結構。樹的每個節點記錄它的類型和對應的出口。輸出端口在發送數據對象時,根據分派樹從上向下進行匹配,然后向匹配的端口進行發送。這樣該組件類的主要邏輯就設計好了,至于一個輸入端口可在@InPort()中設計完成,多個輸出端口可在@OutPorts()中設計完成,最后通過方法openPorts()打開即可。

測試工作可在Network類的define()方法中完成.先用component()方法給組件類命名:

然后用connect()方法進行組件類之間的連接:

最后用initialize()方法給組件類Polymorphism Component提供初始參數:

由于初始參數中指定的類名為Shape,所以輸出的是Shape的面積;當將類名換為Rectangle,輸出的是Rectangle的面積;當將類名換為Triangle,輸出的是Triangle的面積.

若現在要增設Circle類,只需為Circle類開發一個對應的組件類Circle Component,然后在Network類的define()方法中加上以下語句即可:

再在由條件語句組成的稱之為分派樹的數據結構加上對Circle類對象實例的判斷即可,這樣當將initialize()方法中的類名換為Circle,輸出的是Circle的面積。

3 結束語

本文通過Java語言提供的反射機制和類動態加載機制實現了數據流Java多態性的并行程序設計模型,并通過實例對該模型進行了驗證.從實現的過程中可以看出:該過程具有一定的通用性和實用性,有利于數據流Java程序的并行性和模塊化.實現的重點是稱之為分派樹的數據結構.

[1]劉弢,范彬,吳承勇,張兆慶.數據流 Java 并行程序設計模型的設計、實現及運行時優化[J].軟件學報,2009,19(9):2184-2185.

[2]程峰,黃若波,章恒翀.Java2核心技術卷I:基礎知識[M].北京:機械工業出版社,2004:158-190.

[3]Flow·based programming[EB/OL].http://www.Jpaulmorrison.corn/fbp/.

猜你喜歡
構造方法數據流端口
面向可靠性預計的軟件運行時行為模型構造方法
一種有源二端口網絡參數計算方法
一種端口故障的解決方案
汽車維修數據流基礎(上)
汽車維修數據流基礎(下)
多按鍵情況下,單片機端口不足的解決方法
基于Python構造方法與析構方法的研究
基于數據流的結構化功能安全分析方法
北醫三院 數據流疏通就診量
淺談幾何元素在現代家具設計中的應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合