【问题标题】:Is it possible to run remote calls to two different methods in the same thread in Java RMI?是否可以在 Java RMI 的同一个线程中运行对两个不同方法的远程调用?
【发布时间】:2016-08-23 12:14:15
【问题描述】:

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

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

已知method1会先被调用。


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

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

【问题讨论】:

  • 基于该报价的答案是肯定的。
  • 为什么你认为你需要它们在同一个线程中运行?
  • @hengxin 听起来你遇到了设计问题。修复您的远程方法,以便您无需使用其他方法解锁。
  • 您是如何想到使用 RMI 进行 2 阶段提交的?
  • 不要忘记编写代码来处理客户端在第一次调用后离开,并且从不进行第二次调用的情况。

标签: java multithreading threadpool rmi


【解决方案1】:

虽然你的问题表明你很有可能找到更好的程序设计,如果你真的需要这样的功能,你可以通过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());
}

如果您需要等待方法完成,请使用submit()s 返回的Futures。如果您需要从方法返回值,请将 Void 更改为适当的数据类型。

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

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

【讨论】:

  • 谢谢。我认为它会起作用。但是,此方法将阻止对method1method2 的所有远程调用之间的任何可能的并发。我真正想要的是“只要调用者相同,就使用method1 的相同线程对method2 进行远程调用”。 (很容易区分调用者,并且知道首先调用method1。)是否可以概括您的代码以覆盖这种细粒度的情况?
  • 在这种情况下,您需要有多个ExecutorServices,每个呼叫者一个。当调用到达时,您检索相应的执行程序(例如,从地图中)并使用它来提交任务。但要小心,ExecutorService 的实例化成本相对较高,因此最好有一个池,而不是为每个新事务创建它们并在事务完成后销毁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多