2011-11-10 2 views
1

Si un thread jack sur l'hôte A appelle une méthode RMI foo sur l'hôte B, et dans cette méthode l'hôte B appelle une méthode bar sur l'hôte A, bar sera-t-il exécuté par le thread jack? Je suppose que ce sera un autre sujet, mais je pense que cela pourrait être possible en théorie.Bouclage RMI: même fil?

Pourquoi quelqu'un le voudrait? Lock reentrancy, pour un, serait une caractéristique pratique.

+0

C'est possible en théorie, mais je ne crois pas que cela fonctionne de la sorte. Chaque client RMI a son propre thread (s) sur le serveur. –

Répondre

2

Réponse courte: ce sera un différent thread pour sûr.

Long un: pensez-y. Lorsque l'hôte jack @ A appelle l'hôte foo() @ B, le thread jack @ A est bloqué en attente de la réponse foo(). Donc quand foo() @ B appelle bar() @ A le jack @ A est toujours en attente, donc il n'y a aucun moyen que bar() soit traité par lui.

Notez également qu'il existe un pool de threads distinct pour la gestion des appels client RMI côté serveur. Il est donc fort probable que votre thread jack soit réellement un thread d'application et que RMI n'y ait pas accès. À moins que l'appel foo() @ B par jack thread a également été lancé par un appel RMI externe (trop de rappels, panique).

+0

"le jack @ Un thread est bloqué en attente de la réponse de foo()" - Il est en fait bloqué en attente d'un 'notify', et quand il est notifié, il peut théoriquement effectuer une barre si on le lui dit aussi. C'est pourquoi j'ai pensé que c'était possible. –

0

Les threads bien vivent à l'intérieur des processus du système d'exploitation. Donc, si vous avez des JVM différentes, par définition, ce seront des threads réels différents. Un thread ne peut vivre que sur une seule machine. Mais chaque thread attendra que chaque appel RMI se termine, il semblera donc que c'est un seul thread.

+0

Oui, mais ma question concerne une seule machine virtuelle appelant une méthode sur elle-même, * à * une machine virtuelle externe. –

2

3,2 fil Utilisation dans la méthode à distance Invocations

Méthode envoyé par le moteur d'exécution RMI à un objet distant mise en œuvre peut ou ne peut pas exécuter dans un thread séparé. Le RMI runtime ne garantit pas le mappage de l'objet distant invocations aux threads. Étant donné que l'appel de méthode à distance sur le même objet distant peut s'exécuter simultanément, une implémentation d'objet à distance doit s'assurer que son implémentation est thread-safe.

De http://download.oracle.com/javase/6/docs/platform/rmi/spec/rmi-arch3.html

Ainsi, explicitement, qui dit que le fil d'appel initial, « prise », n'est pas censé être lié à l'invocation à distance, et en tant que telle ne peut y avoir aucune garantie en ce qui concerne le fil utilisé par le serveur RMI sur 'A' lors de la gestion de l'appel bar. Et, comme Thomasz le dit, jack bloque déjà, il ne pourra jamais traiter l'invocation à distance de 'B' de toute façon.