如果主机A上的线程jack
在主机B上调用RMI方法foo
,并且在该方法中主机B在主机A上调用方法bar
,则{{1}将bar
由线程jack
执行?
我认为这将是另一个主题,但我认为理论上可能是这样。
为什么有人会想要它?例如,锁定重入是一个方便的特征。
答案 0 :(得分:2)
简短回答:这肯定是一个不同的主题。
长篇:想一想。当jack @ A
主机呼叫foo() @ B
主机时,jack @ A
线程将被阻止,等待foo()
响应。因此,当foo() @ B
调用bar() @ A
时jack @ 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调用完成,所以它看起来像是一个单线程。