提问人:arocketman 提问时间:7/16/2014 更新时间:7/16/2014 访问量:1032
客户端的 Java RMI 线程在调用同一个远程对象时是按顺序还是并发执行?
Java RMI threads on client-side are executing sequentially or concurrently when calling the same remote object?
问:
我无法理解 java RMI 的特定方面。
有一个客户端创建 N 个线程,用于在 RMIregistry 上执行查找:
Registry rmiRegistry;
try {
rmiRegistry = LocateRegistry.getRegistry(8585);
IGestoreSportello igs = (IGestoreSportello)rmiRegistry.lookup("gestoresportelli");
ExecutorService s = Executors.newCachedThreadPool();
for(int i = 0; i < T; i++){
s.execute(new threadRunner(igs));
}
“gestoresportelli”之前在服务器中注册为服务的地方。
因此,就我的理解而言,客户端对 SAME 对象的所有引用都相同。
我在这里要问的是,当我在这个对象上调用一个方法时,是执行服务器代码的 CLIENT 吗?
还是服务器按顺序调用该对象上的方法?
因此,假设我们有:
线程 1、线程 2、线程 3。它们都在服务器上注册的同一远程对象上调用相同的方法。
他们是否按顺序称呼它:
Thread1->RemoteObjectReference.doSomething();
wait thread 1 to finish...
Thread2->RemoteObjectReference.doSomething();
wait thread 2 to finish...
Thread3->RemoteObjectReference.doSomething();
或同时:
Thread1->RemoteObjectReference.doSomething();
Thread2->RemoteObjectReference.doSomething();
Thread3->RemoteObjectReference.doSomething();
同时,即使这是同一个远程对象?
我希望我足够清楚。谢谢!
答:
1赞
user207421
7/16/2014
#1
我在这里要问的是,当我在这个对象上调用一个方法时,是执行服务器代码的 CLIENT 吗?
不。
还是服务器按顺序调用该对象上的方法?
它是服务器,但未定义顺序性。
他们是否按顺序称呼它
它没有定义。
或同时:
它没有定义。
更明确地说,RMI 规范明确指出,不能保证客户端线程和服务器线程之间的关联。
你只能从中推断出,你不能假设它是单线程的。
评论
0赞
arocketman
7/16/2014
因此,如果我有 30 个线程在远程对象上调用相同的方法,则此方法的睡眠时间为 5 秒......是需要 30*5 秒还是我们在 5 秒左右?
0赞
user207421
7/16/2014
你不明白“它没有定义”的哪一部分?
0赞
arocketman
7/16/2014
做了一个测试程序并运行了很多次,它总是需要 5 秒。我在这里找到了这个解释:comp.lancs.ac.uk/~weerasin/csc253/tutorials/week7.html “因此,如果您从不同的客户端进行远程调用(在不同的 JVM 中执行),则每个调用都将在单独的线程中运行。但是,如果您从同一客户端进行并发调用(这可以通过使用客户端线程来实现,请参阅下文),则这些调用可能会在同一服务器线程上执行。无论如何,谢谢你。
0赞
user207421
7/16/2014
我引用的是 RMI 规范。你不能引用非规范性的参考资料来反驳这一点。你引用的那个自相矛盾。你所询问的行为是故意和明确地没有指定的。时期。您可能观察到的任何行为都是该实现的行为。它可以在一夜之间免费更换。
0赞
arocketman
7/16/2014
我没有拒绝任何事情。我只是想理解我目前正在研究的事物的特定行为。也许我必须更好地研究它才能更深入地理解。我观察到的行为与我在网上找到的来源兼容,这是我在上一个答案中提供的来源之一。我不是想在这里证明什么。只是以为看似一个简单的问题有一个简单的答案(是的,我得到了“它没有定义”)。正如你所说,我必须提供一个 RMI 规范,我将确保从现在开始从那里学习。感谢您抽出时间接受采访。
评论