关于线程使用的Java RMI规范:“..可能或可能不在单独的线程中执行”

时间:2011-07-28 12:15:11

标签: java multithreading rmi specifications

我的申请可能有问题。有一个运行多个线程的客户端可能会通过Java RMI执行相当耗时的服务器调用。当然,来自一个客户的耗时电话不应该阻止其他人 我测试了它,它可以在我的机器上运行。所以我在客户端创建了两个Threads,并在服务器上创建了一个虚拟调用。在启动时,客户端都调用虚拟方法,该方法只执行大量的sysout。可以看出,这些调用是并行处理的,没有阻塞 直到一位同事表示RMI规范并不一定能保证这种行为,我才感到非常满意 实际上兰卡斯特大学的一篇文章说明了

  

“由RMI运行时调度到远程对象的方法   实现(服务器)可能会也可能不会在单独的线程中执行。   来自不同客户端的呼叫将执行虚拟机   在不同的线程。从同一台客户机上它不是   保证每个方法都在一个单独的线程“[1]

中运行

我该怎么办?是否有可能在实践中不起作用?

3 个答案:

答案 0 :(得分:1)

理论上,是的,您可能不得不担心这一点。实际上,所有主流rmi都会在多个线程中传入所有来电,所以除非你遇到一些不起眼的jvm,否则你没有什么可担心的。

答案 1 :(得分:0)

这个措辞意味着你不能假设它将在同一个线程中执行。所以你负责任何所需的同步。

答案 2 :(得分:0)

基于我在Mac笔记本电脑上的测试,并行收到的每个客户端请求似乎都在一个单独的线程上执行(我尝试了多达一千个线程而没有任何问题。我不知道如果有一个上限。我的猜测是线程的最大数量将仅受内存限制)。

然后这些线程会闲置一段时间(一两分钟),以防它们可以为更多客户端提供服务。如果它们在一段时间内未被使用,它们就会被GC控制。

请注意,我在服务器上使用Thread.sleep()来保留每个请求,因此没有任何线程可以完成任务并转到另一个请求。

关键是,如果需要,JVM甚至可以为每个客户端请求分配一个单独的线程。如果工作完成且线程是空闲的,它可以重用现有线程而不创建新线程。

我没有看到由于RMI限制而导致任何客户端请求无法等待的情况。无论服务器上有多少线程“忙”处理现有请求,都会收到新的客户端请求。