2016-08-23 17 views
2

Предположим, что Remote class RemoteServer имеет два пульта дистанционного управления method1 и method2.Можно ли запускать удаленные вызовы на два разных метода в одном потоке в Java RMI?

Возможно ли запустить удаленные вызовы этим двум методам в том же потоке сервера в Java RMI?

Известно, что сначала будет называться method1.


Я читал "Thread Usage in Remote Method Invocations" (below) и понятия не имею.

Метод, отправленный средой RMI для реализации удаленного объекта, может выполняться или не выполняться в отдельном потоке. Время выполнения RMI не дает никаких гарантий относительно сопоставления вызовов удаленных объектов потокам.

+2

Ответа на основе этой цитаты фирмы нет. – biziclop

+0

Почему, по-вашему, вам нужно, чтобы они бегали в той же теме? – Kayaman

+0

@Kayaman В 'method1' я использую' writeLock.lock() ', и я хочу разблокировать его, используя' writeLock.unlock() 'в' method2'. Здесь '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()); 
} 

Если вам нужно ждать метода доработок, используйте Future S, которые возвращаются submit() с. Если вам нужно вернуть значения из методов, измените значение Void для соответствующих типов данных.

В Java 8 это проще, вам не нужны Callable S:

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

Спасибо. Я думаю, это сработает. Однако этот метод предотвратит любой возможный параллелизм между всеми удаленными вызовами 'method1' и' method2'. На самом деле я хочу «запустить удаленный вызов' method2' с тем же потоком для 'method1' всякий раз, когда вызывающий абонент становится тем же *. (Легко отличить вызывающих, и известно, что 'method1' вызывается первым.) Можно ли обобщить ваш код, чтобы покрыть этот мелкозернистый случай? – hengxin

+1

В таком случае вам нужно иметь несколько 'ExecutorService', по одному для каждого вызывающего. Когда поступит вызов, вы получаете соответствующий исполнитель (например, с карты) и используете его для отправки задания.Но будьте осторожны: «ExecutorService» относительно дорогая для создания экземпляра, поэтому лучше иметь пул, а не создавать их для каждой новой транзакции и уничтожать после завершения транзакции. –