2011-11-10 15 views
1

如果主機A上的線程jack調用主機B上的RMI方法foo,並且在該方法中主機B調用主機A上的方法bar,那麼bar將由線程jack執行?RMI回送:同一個線程?

我認爲這將是另一個線程,但我認爲這在理論上可能是可能的。

爲什麼有人會想要它?舉個例子,鎖定重入是一個方便的功能。

+0

這在理論上是可能的,但我不認爲它在實踐中是這樣工作的。每個RMI客戶端在服務器上都有自己的線程。 –

回答

2

簡短回答:這將是一個不同線程肯定。

龍一:想一想。當jack @ A主機調用foo() @ B主機時,jack @ A線程被阻塞,等待foo()響應。所以當foo() @ B調用bar() @ Ajack @ A保證仍在等待,因此bar()將不會被它處理。

另請注意,有一個單獨的線程池用於處理服務器端的RMI客戶端調用。所以很可能你的jack線程實際上是一個應用程序線程,RMI無法訪問它。除非通過jack呼叫foo() @ B線程也由外部RMI呼叫啓動(回調太多,恐慌)。

+0

「jack @線程被阻塞等待foo()響應」 - 它實際上阻塞了等待'notify',並且當它被通知時,如果它被告知,它理論上可以執行條。這就是爲什麼我認爲這可能是可能的。 –

0

嗯線程活在OS進程內。所以,如果你有不同的JVM,根據定義,它們將是不同的實際線程。一個線程只能在一臺機器上運行。但每個線程都會等待每個RMI調用完成,因此它看起來像是一個單線程。在遠程方法調用

由RMI運行時調度到遠程對象 實現可以是或可以不是在一個單獨的線程中執行的方法,

+0

是的,但我的問題是關於單個虛擬機自己調用方法,*通過*外部虛擬機。 –

2

3.2線程使用。 RMI 運行時不保證將遠程對象 調用映射到線程。由於同一個遠程對象上的遠程方法調用可能同時執行,因此遠程對象實現 需要確保其實現是線程安全的。

http://download.oracle.com/javase/6/docs/platform/rmi/spec/rmi-arch3.html

所以,明確,是說,初始調用線程,「傑克」,沒有指定要依賴於遠程調用,這樣可以有關於線程難保在處理bar呼叫時,由RMI服務器在'A'上使用。

而且,正如Thomasz所說,jack已經被阻塞了,它永遠無法從'B'處理遠程調用。