2011-07-28 18 views
2

我的應用程序可能有問題。有一個客戶端運行多個線程,可能會通過Java RMI執行對服務器的非常耗時的調用。當然,來自一個客戶的時間消耗呼叫不應該阻止其他人。
我測試過了,它可以在我的機器上運行。所以我在客戶端創建了兩個線程,並在服務器上創建了一個虛擬調用。啓動時,客戶端都會調用只包含大量sysout的虛擬方法。可以看出,這些調用是並行處理的,沒有阻塞。
我很滿意,直到一位同事指出RMI規範不一定能保證這種行爲。
而真正的蘭開斯特大學的HP文本指出關於線程使用的Java RMI規範:「..可能或不可以在單獨的線程中執行」

「由RMI運行時調度到遠程對象 實現(服務器)的方法可能會或可能不會在一個單獨的線程中執行。 來自不同客戶端的呼叫虛擬機將在不同的線程中執行 。從同一臺客戶機它不 保證每個方法將在一個單獨的線程中運行」 [1]

我能做些什麼呢?它有可能在實踐中不起作用嗎?

回答

1

理論上,是的,您可能不必擔心這一點。實際上,所有主流rmi都會對所有來電進行多線程處理,因此除非您遇到一些模糊的jvm,否則您無需擔心。

0

這是什麼意思是你不能假設它將全部在同一個線程中執行。所以你負責任何所需的同步。

0

根據我在Mac筆記本電腦測試,並行接收的每一個客戶請求似乎是一個單獨的線程執行(我試過高達一千線程沒有任何問題。我不知道是否有一個上限雖然我的猜測是線程的最大數量將僅限於內存)。

這些線程隨後會停留一段時間(一兩分鐘),以防服務更多客戶端。如果他們在一段時間內沒有使用,他們會得到GC。

請注意,我在服務器上使用了Thread.sleep()來保存每個請求,因此沒有任何線程可以完成任務並轉到其他請求。

問題是,如果需要,JVM甚至可以爲每個客戶端請求分配一個單獨的線程。如果工作完成並且線程是免費的,它可以重用現有線程而不創建新線程。

我沒有看到任何客戶端請求會因RMI約束而停滯不前的情況。無論服務器上有多少線程正忙於處理現有請求,都會收到新的客戶端請求。

相關問題