2016-08-23 60 views
2

假设Remote class RemoteServer有两种远程方法method1method2是否可以在Java RMI的同一线程中对两个不同的方法执行远程调用?

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

据悉,method1将首先被调用。


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

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

+2

基于该帖的答案是一个坚定的没有。 – biziclop

+0

为什么你认为你需要他们在同一个线程中运行? – Kayaman

+0

@Kayaman在'method1'中,我使用了'writeLock.lock()',并且我想使用'method2'中的'writeLock.unlock()'来解锁它。这里,'writeLock'是一个'ReentrantReadWriteLock'。 – hengxin

回答

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

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

在Java 8它更简单,你不需要Callable S:

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

谢谢。我认为它会起作用。但是,此方法将防止所有对'method1'和'method2'的远程调用发生任何可能的并发。我真正想要的是“每当*调用者是相同的*”时,使用'method1'的相同线程对'method2'运行远程调用。 (很容易区分调用者,并且已知'method1'被首先调用。)是否有可能将您的代码概括为涵盖此细粒度的情况? – hengxin

+1

在这种情况下,您需要有几个'ExecutorService',每个调用者一个。当呼叫到达时,您可以检索相应的执行程序(例如,从地图中)并使用它来提交任务。但要小心,“ExecutorService”实例化起来相对昂贵,所以最好有一个池,而不是为每个新事务创建它们,并在事务完成后销毁。 –

相关问题