在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
});