【问题标题】: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 使用了一个线程池,这意味着一个队列。还有其他实现。
一般来说,您最后一个问题的答案是,除了确保最小但足够的同步之外,您无需执行任何操作。
编辑@CyberneticTwerkGuruOrc 已删除答案中的链接上的一些 cmets,指的是基于 2002 年 RMI 构建的晦涩且过时的框架:
- 他一直说“自治”,他的意思是“异步”。
- 他说如果客户端“回家”连接线程“永远挂起”是错误的。
- 由于等待,您将需要数量惊人的客户竞争资源,让其中一个“回家”。
- 您已经可以通过系统属性在 RMI 中获得客户端超时。
- 使用
Object.wait() 和通知线程来实现超时是非常粗暴的。
- 客户端通常不能关闭服务器。服务器应该在自己的甜蜜时间自行关闭。在远程接口中包含
shutdown() 方法是初步安全漏洞。
- 他误用了“持久”一词。持久性服务器在重启后仍然存在,例如
Activatable。
- “线程内存”一词未出现在 Java 语言规范的第 17 章中。他将正式的内存模型与运行时实际发生的事情混为一谈。