【问题标题】:Java RMI specification on thread usage: "..may or may not execute in a separate thread"关于线程使用的 Java RMI 规范:“..可能会或可能不会在单独的线程中执行”
【发布时间】:2011-07-28 12:15:11
【问题描述】:

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

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

对此我能做些什么?有没有可能在实践中行不通?

【问题讨论】:

    标签: java multithreading rmi specifications


    【解决方案1】:

    理论上,是的,您可能不得不担心这一点。实际上,所有主流的 rmi 都将所有来电都实现了多线程,所以除非你在运行一些不起眼的 jvm,否则你不必担心。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        然后这些线程会挂起一段时间(一两分钟),以防它们可以为更多客户端提供服务。如果它们有一段时间没有使用,它们会被 GC 处理。

        请注意,我在服务器上使用Thread.sleep() 来阻止每个请求,因此没有一个线程可以完成任务并继续处理另一个请求。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-27
          • 2015-04-22
          • 2018-07-15
          • 2016-10-25
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多