2011-07-28 17 views
2

我的应用程序可能有问题。有一个客户端运行多个线程,可能会通过Java RMI执行对服务器的非常耗时的调用。当然,来自一个客户的时间消耗呼叫不应该阻止其他人。
我测试过了,它可以在我的机器上运行。所以我在客户端创建了两个线程,并在服务器上创建了一个虚拟调用。启动时,客户端都会调用只包含大量sysout的虚拟方法。可以看出,这些调用是并行处理的,没有阻塞。
我很满意,直到一位同事指出RMI规范不一定能保证这种行为。
而真正的兰开斯特大学的HP文本指出关于线程使用的Java RMI规范:“..可能或不可以在单独的线程中执行”

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

我能做些什么呢?它有可能在实践中不起作用吗?

回答

1

理论上,是的,您可能不必担心这一点。实际上,所有主流rmi都会对所有来电进行多线程处理,因此除非您遇到一些模糊的jvm,否则您无需担心。

0

这是什么意思是你不能假设它将全部在同一个线程中执行。所以你负责任何所需的同步。

0

根据我在Mac笔记本电脑测试,并行接收的每一个客户请求似乎是一个单独的线程执行(我试过高达一千线程没有任何问题。我不知道是否有一个上限虽然我的猜测是线程的最大数量将仅限于内存)。

这些线程随后会停留一段时间(一两分钟),以防服务更多客户端。如果他们在一段时间内没有使用,他们会得到GC。

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

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

我没有看到任何客户端请求会因RMI约束而停滞不前的情况。无论服务器上有多少线程正忙于处理现有请求,都会收到新的客户端请求。

相关问题