RMI环回:相同的线程?

时间:2011-11-10 15:03:05

标签: java multithreading rmi

如果主机A上的线程jack在主机B上调用RMI方法foo,并且在该方法中主机B在主机A上调用方法bar,则{{1}将bar由线程jack执行?

我认为这将是另一个主题,但我认为理论上可能是这样。

为什么有人会想要它?例如,锁定重入是一个方便的特征。

3 个答案:

答案 0 :(得分:2)

简短回答:这肯定是一个不同的主题。

长篇:想一想。当jack @ A主机呼叫foo() @ B主机时,jack @ A线程将被阻止,等待foo()响应。因此,当foo() @ B调用bar() @ Ajack @ A保证仍在等待,因此无法由bar()处理jack

另请注意,在服务器端有一个单独的线程池用于处理RMI客户端调用。所以很可能你的foo() @ B线程实际上是一个应用程序线程,而RMI无法访问它。除非jack线程调用{{1}}也是由外部RMI调用(太多回调,恐慌)启动的。

答案 1 :(得分:2)

  

3.2远程方法调用中的线程使用

     

由RMI运行时调度到远程对象的方法   实现可能会也可能不会在单独的线程中执行。 RMI   运行时不保证映射远程对象   对线程的调用。由于远程方法调用相同   远程对象可以并发执行,远程对象实现   需要确保其实现是线程安全的。

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

因此,明确地说,初始调用线程' jack'未指定与远程调用绑定,因此无法保证RMI使用的线程服务器上的' A'处理bar电话时。

而且,正如Thomasz所说,jack已经被阻止,它永远无法处理来自' B'反正。

答案 2 :(得分:0)

Well Threads存在于OS进程中。因此,如果您有不同的JVM,根据定义,它们将是不同的实际线程。线程只能在一台机器上运行。但是每个线程都会等待每个RMI调用完成,所以它看起来像是一个单线程。