Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RMI-远程对象-设计问题_Java_Rmi - Fatal编程技术网

Java RMI-远程对象-设计问题

Java RMI-远程对象-设计问题,java,rmi,Java,Rmi,我一直在阅读有关RMI的Java教程。我喜欢这里概述的实现远程接口的方法: 我想知道两件事: 1) 关于上述链接中概述的executeTask方法,如果ComputeEngine只是调用任务的execute方法,该设计如何允许远程对象(任务)访问某种全局状态 2) 这种设计适合多线程环境吗 非常感谢。广告1:请注意,远程客户端对ComputeEngine类一无所知,只知道Compute接口。此外,服务器实现可能会完全改变,但如果接口没有改变,客户端就不会注意到。如果要将某些上下文传递给来自远程

我一直在阅读有关RMI的Java教程。我喜欢这里概述的实现远程接口的方法:

我想知道两件事:

1) 关于上述链接中概述的
executeTask
方法,如果ComputeEngine只是调用任务的execute方法,该设计如何允许远程对象(任务)访问某种全局状态

2) 这种设计适合多线程环境吗


非常感谢。

广告1:请注意,远程客户端对
ComputeEngine
类一无所知,只知道
Compute
接口。此外,服务器实现可能会完全改变,但如果接口没有改变,客户端就不会注意到。如果要将某些上下文传递给来自远程客户端的任务,请在接口层执行:

public class ComputeEngine implements Compute {

private GlobalContext globalContext = //...

public <T> T executeTask(Task<T> t) {
    return t.execute(globalContext);
}
广告2:它将与同时调用该服务的多个客户端协同工作。但是,由您以线程安全的方式实现服务器。您在“线程安全”中提到的教程中的示例,但我使用
GlobalContext
的代码可能不适用。请注意,多个客户端将同时使用同一个
globalContext
实例,这可能会但不一定会导致一些问题。这可能是最有趣的部分


最后请记住,从远程客户端接收未知的
任务并在服务器上运行它是非常令人印象深刻的,但并不十分安全。

广告1:请注意,远程客户端对
计算引擎
类一无所知,只知道
计算
接口。此外,服务器实现可能会完全改变,但如果接口没有改变,客户端就不会注意到。如果要将某些上下文传递给来自远程客户端的任务,请在接口层执行:

public class ComputeEngine implements Compute {

private GlobalContext globalContext = //...

public <T> T executeTask(Task<T> t) {
    return t.execute(globalContext);
}
广告2:它将与同时调用该服务的多个客户端协同工作。但是,由您以线程安全的方式实现服务器。您在“线程安全”中提到的教程中的示例,但我使用
GlobalContext
的代码可能不适用。请注意,多个客户端将同时使用同一个
globalContext
实例,这可能会但不一定会导致一些问题。这可能是最有趣的部分


最后请记住,从远程客户端接收未知的
任务并在服务器上运行它是非常令人印象深刻的,但并不十分安全。

嗨,Tomasz,回答得很好。谢谢你。关于第一个答案,如果任务是ComputeEngine私有实例变量,它将如何访问“globalContext”?如果这是静态的,不是更好吗?再次感谢。我添加了一个澄清的例子,希望能有所帮助。托马斯兹,非常感谢你的帮助。关于托马斯兹,回答得很好。谢谢你。关于第一个答案,如果任务是ComputeEngine私有实例变量,它将如何访问“globalContext”?如果这是静态的,不是更好吗?再次感谢。我添加了一个澄清的例子,希望能有所帮助。托马斯兹,非常感谢你的帮助。当做