2016-08-23 1 views
2

Supposons que Remote class RemoteServer possède deux méthodes distantes method1 et method2.Est-il possible d'exécuter des appels à distance à deux méthodes différentes dans le même thread dans Java RMI?

Est-il possible d'exécuter les appels à distance à ces deux méthodes dans le même thread du serveur dans Java RMI?

Il est connu que method1 sera appelée en premier. J'ai lu "Thread Usage in Remote Method Invocations" (below) et n'ai aucune idée.

Une méthode envoyée par le moteur d'exécution RMI à une implémentation d'objet distant peut s'exécuter dans un thread distinct ou non. L'exécution de RMI ne garantit pas le mappage des invocations d'objets distants aux threads.

+2

La réponse basée sur cette citation est un pas ferme. – biziclop

+0

Pourquoi pensez-vous que vous avez besoin d'eux pour courir dans le même fil? – Kayaman

+0

@Kayaman Dans 'method1', j'utilise un' writeLock.lock() 'et je veux le déverrouiller en utilisant' writeLock.unlock() 'dans' method2'. Ici, 'writeLock' est un' ReentrantReadWriteLock'. – hengxin

Répondre

3

Bien que votre question indique qu'il ya une bonne chance que vous pouvez trouver une meilleure conception des programmes, si vous avez vraiment besoin cette fonctionnalité, vous pouvez le mettre en œuvre au moyen de ThreadPoolExecutor avec un seul fil. Il suffit d'envelopper vos méthodes method1() et method2() dans deux différents Callable et de les soumettre à votre pool monothread.

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

Si vous avez besoin d'attendre l'achèvement de la méthode, utilisez Future s qui sont retournées par submit() s. Si vous devez renvoyer des valeurs à partir des méthodes, modifiez Void pour les types de données appropriés.

En Java 8 il est plus simple, vous n'avez pas besoin Callable s:

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

Merci. Je pense que cela va fonctionner. Toutefois, cette méthode empêche toute concurrence possible entre tous les appels distants à 'method1' et' method2'. Ce que je veux vraiment, c'est "lancer l'appel distant à' method2' avec le même thread pour 'method1' quand * l'appelant est le même *". (Il est facile de distinguer les appelants et on sait que 'method1' est appelée en premier.) Est-il possible de généraliser votre code pour couvrir ce cas précis? – hengxin

+1

Dans ce cas, vous devez avoir plusieurs 'ExecutorService's, un pour chaque appelant. Lorsqu'un appel arrive, vous récupérez l'exécuteur correspondant (à partir d'une carte, par exemple) et l'utilisez pour soumettre la tâche.Mais attention, 'ExecutorService' est relativement coûteux à instancier, il est donc préférable d'en avoir un pool plutôt que de le créer pour chaque nouvelle transaction et de le détruire une fois la transaction terminée. –