【问题标题】:java RMI threading systemjava RMI线程系统
【发布时间】:2014-10-27 21:28:09
【问题描述】:

假设一个简单的 java RMI 系统(Hello World),我的问题是,如果我在客户端运行 10 个线程来调用远程(服务器)对象,目标服务器是否也会创建 10 个线程?或者他们将通过队列或其他方式进行?
问题:可能有一些对远程对象的并发调用,其中一个可能需要相当长的时间来处理,所以现在我应该注意服务器端的线程,或者可能有一些可用于这种情况的实现。
提前致谢。

【问题讨论】:

  • 它很可能同时使用队列和线程进行异步调用。

标签: java multithreading rmi


【解决方案1】:

未指定。 RMI 规范所说的只是客户端线程和服务器线程之间没有保证的关联。

这个神秘的意思是你不能假设它是单线程的。

具体实现的行为方式取决于他们。例如,Oracle 的 RMI/JRMP 对每个接受的连接使用一个新线程,没有排队,但这可以通过客户端的连接池来缓解。上次我查看时,IBM 使用了一个线程池,这意味着一个队列。还有其他实现。

一般来说,您最后一个问题的答案是,除了确保最小但足够的同步之外,您无需执行任何操作。

编辑@Cyber​​neticTwerkGuruOrc 已删除答案中的链接上的一些 cmets,指的是基于 2002 年 RMI 构建的晦涩且过时的框架:

  1. 他一直说“自治”,他的意思是“异步”。
  2. 他说如果客户端“回家”连接线程“永远挂起”是错误的。
  3. 由于等待,您将需要数量惊人的客户竞争资源,让其中一个“回家”。
  4. 您已经可以通过系统属性在 RMI 中获得客户端超时。
  5. 使用Object.wait() 和通知线程来实现超时是非常粗暴的。
  6. 客户端通常不能关闭服务器。服务器应该在自己的甜蜜时间自行关闭。在远程接口中包含shutdown() 方法是初步安全漏洞。
  7. 他误用了“持久”一词。持久性服务器在重启后仍然存在,例如 Activatable
  8. “线程内存”一词未出现在 Java 语言规范的第 17 章中。他将正式的内存模型与运行时实际发生的事情混为一谈。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2020-02-20
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2013-01-28
    • 2019-02-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多