我正在尝试理解Oracle的Java RMI教程,我有一些问题。作为参考,教程链接在这里:
1)在服务器示例中,main函数的最后一行是:System.out.println("ComputeEngine bound");
。正常执行会说,此时主函数退出并且程序终止。但是,有些东西导致程序阻塞。有没有人知道为什么程序会在运行服务器时阻塞(而不是在打印计算引擎后退出)?
2)关于上一个问题,似乎服务器阻塞并侦听端口。它在听什么端口? RMIRegistry如何知道服务器正在侦听哪个端口?
3)我的另一个问题是当客户端从RMIRegistry获取存根(使用registry.lookup
)然后在此存根上调用executeTask
时,计算是否在运行RMIRegistry的机器上进行,或者机器运行服务器代码?即存根是否告诉RMIRegistry在注册表中或服务器executeTask
函数内的computeEngine
实例上运行main
?
答案 0 :(得分:2)
RMI创建后台侦听线程。在这些线程死亡之前,程序不会终止。
它指定0作为端口,这意味着它使用OS定义范围的随机端口。
存根封装TCP / IP调用以通知服务器调用该方法。因此,实际的实现在托管代码的服务器上运行。如果在服务器代码上放置println,则会在调用该函数时看到它打印出来。
答案 1 :(得分:0)