是否可以在Java RMI中的同一线程中对两个不同的方法运行远程调用?

时间:2016-08-23 12:14:16

标签: java multithreading threadpool rmi

假设远程class RemoteServer有两个远程方法method1method2

是否可以在Java RMI中的服务器的同一线程中运行对这两个方法的远程调用?

众所周知,method1将首先被召唤。

我已阅读"Thread Usage in Remote Method Invocations" (below)并且没有任何想法。

  

由RMI运行时调度到远程对象实现的方法可能会也可能不会在单独的线程中执行。 RMI运行时不保证将远程对象调用映射到线程。

1 个答案:

答案 0 :(得分:3)

虽然你的问题表明你很有可能找到更好的程序设计,如果你真的需要这样的功能,你可以通过ThreadPoolExecutor用一个线程实现它。只需将方法method1()method2()包装到两个不同的Callable中,然后将它们提交到单线程池中。

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

如果您需要等待方法完成,请使用Future返回的submit()。如果需要返回方法中的值,请更改Void以获取适当的数据类型。

在Java 8中,它更简单,您不需要Callable s:

executor.submit(() -> {
    // call the method you need here
});