在JavaRMI中,是否可以在同一线程中运行对两个不同方法的远程调用?
假设远程在JavaRMI中,是否可以在同一线程中运行对两个不同方法的远程调用?,java,multithreading,threadpool,rmi,Java,Multithreading,Threadpool,Rmi,假设远程类RemoteServer有两个远程方法method1和method2 在JavaRMI中,是否可以在服务器的同一线程中运行对这两个方法的远程调用 已知将首先调用method1 我读过书,没有任何想法 RMI运行时分派给远程对象实现的方法可以在单独的线程中执行,也可以不在单独的线程中执行。RMI运行时不保证将远程对象调用映射到线程 尽管您的问题表明您很有可能找到更好的程序设计,但如果您确实需要此类功能,您可以通过使用单个线程的ThreadPoolExecutor来实现它。只需将方法me
类RemoteServer
有两个远程方法method1
和method2
在JavaRMI中,是否可以在服务器的同一线程中运行对这两个方法的远程调用
已知将首先调用method1
我读过书,没有任何想法 RMI运行时分派给远程对象实现的方法可以在单独的线程中执行,也可以不在单独的线程中执行。RMI运行时不保证将远程对象调用映射到线程
尽管您的问题表明您很有可能找到更好的程序设计,但如果您确实需要此类功能,您可以通过使用单个线程的
ThreadPoolExecutor
来实现它。只需将方法method1()
和method2()
包装成两个不同的可调用的
,并将它们提交到单线程池
class Method1Task implements Callable<Void> {
public Void call() throws Exception {
// method 1 body here
return null;
}
}
class Method2Task implements Callable<Void> {
public Void call() throws Exception {
// method 2 body here
return null;
}
}
...
// Create a single-thread pool and use it to submit tasks
private final ExecutorService executor = Executors.newFixedThreadPool(1);
void method1() {
executor.submit(new Method1Task());
}
void method2() {
executor.submit(new Method2Task());
}
基于这句话的答案是肯定的否。你为什么认为你需要它们在同一个线程中运行?@hengxin听起来你有一个设计问题。修复您的远程方法,这样您就不需要用其他方法解锁锁。您是如何想到使用RMI进行两阶段提交的?不要忘记编写代码来处理客户端在第一次调用后离开,而从不进行第二次调用的情况。谢谢。我想它会起作用的。但是,此方法将防止对
method1
和method2
的所有远程调用之间出现任何可能的并发。我真正想要的是“只要调用它们的调用方相同,就用method1
的相同线程运行对method2
的远程调用”。(很容易区分调用者,而且已知先调用method1
)是否可以概括您的代码以涵盖这种细粒度的情况?在这种情况下,您需要有几个ExecutorService
s,每个调用者一个。当调用到达时,您检索相应的执行器(例如,从映射中),并使用它提交任务。但是要小心,ExecutorService
的实例化成本相对较高,因此最好有一个它们池,而不是为每个新事务创建它们,并在事务完成后销毁它们。
executor.submit(() -> {
// call the method you need here
});