2015-01-03 112 views
0

我目前正在研究Java RMI如何工作,但我不明白某個方面。
在非分佈式多線程環境中,如果同一對象上的方法同時從不同的線程中調用,那麼每個線程將在相應線程的堆棧上執行(訪問共享數據不是我問題的一部分)。
在分佈式系統中,由於客戶端進程調用存根上的方法,並且在創建遠程對象的進程的堆棧上執行實際調用,因此如何同時調用方法?換句話說,當有兩個(或更多)請求在該線程上執行相同的方法時,在服務器線程中發生了什麼?
我想到了這個問題,因爲我想將它與我習慣的 - 執行方式在不同的堆棧上進行比較。併發訪問遠程對象Java RMI

+0

RMI服務器使用線程池來處理傳入的「調用」。根據本教程http://www.comp.lancs.ac.uk/~weerasin/csc253/tutorials/week7.html,客戶端進程中的線程與服務器中的線程之間沒有對應關係(即,來自同一進程的請求客戶端線程可能運行在不同的服務器線程中,並且來自同一客戶端進程的不同線程的請求可能運行在同一個服務器線程中。)來自不同客戶端進程的請求應該始終運行在不同的服務器線程中。 –

+0

@jameslarge Sun/Oracle實施中沒有線程池。您引用的鏈接不是規範性參考。 – EJP

回答

1

如何同時調用某個方法?

沒有指定。在RMI specification中仔細說明:「RMI運行時不保證將遠程對象調用映射到線程。」

這個祕密的含義是,你不能假設服務器是單線程的。

換句話說,當有兩個(或多個)請求在該線程上執行相同的方法時,在說服務器線程時會發生什麼?

不能有兩個或更多的請求在同一線程上執行該方法。這個問題沒有意義。你已經假定了一個並不存在的獨特'let say server thread'。

但是,可以有兩個或更多的請求來執行由兩個或更多併發客戶端,或一個客戶端中兩個或更多併發線程產生的方法,或者由於RMI規範的措辭,在服務器上假設一個單線程調度模型。

在Oracle/Sun實現中,它確實是多線程的,與IBM實現一樣。我不知道任何不是多線程的RMI實現,並且任何這樣的實現基本上都是無用的。

+0

謝謝你的好解釋。 – PetarMI