2011-11-10 4 views
1

ホストAのスレッドjackがホストBのRMIメソッドfooを呼び出し、そのメソッドでホストBがホストAのメソッドbarを呼び出した場合、barはスレッドjackによって実行されますか?RMIループバック:同じスレッドですか?

私はそれが別のスレッドになると仮定しますが、理論的には可能かもしれません。

なぜ誰かがそれを望んでいますか?ロックリエントリーは、便利な機能です。

+0

理論上は可能ですが、実際にはそのように動作するとは思いません。各RMIクライアントは、サーバ上に独自のスレッドを持っています。 –

答えて

2

短い答え:これは確かに異なるスレッドになります。

ロングワン:考えてみてください。 jack @ Aホストがfoo() @ Bホストを呼び出すと、応答を待ってjack @ Aスレッドがブロックされます。 foo() @ B呼び出しはjack @ Aはまだ待っていることが保証されているbar() @ Aときに、それゆえbar()は、それによって処理されるという方法はありません。

また、サーバー側でRMIクライアント呼び出しを処理するための別のスレッドプールがあります。したがって、おそらくあなたのjackスレッドは実際にはアプリケーションスレッドであり、RMIはそれにアクセスできません。 foo() @ Bjackにコールしない限り、スレッドは外部RMIコール(too callbacks、パニック)によっても開始されました。

+0

"ジャックはスレッドがfoo()応答を待ってブロックされています" - 実際には 'notify'を待ってブロックされていますが、通知されると理論的に言えばバーを実行できます。だから私はそれが可能かもしれないと思った。 –

0

よくスレッドはOSプロセス内にあります。したがって、異なるJVMを定義している場合、実際のスレッドとは異なります。スレッドは単一のマシン上にしか存在できません。しかし、各スレッドは各RMI呼び出しが完了するのを待つので、それは単一スレッドのように見えます。リモート・メソッド呼び出し

実装は、または別のスレッドで実行してもしなくてもよいリモートオブジェクトをRMIランタイムによってディスパッチ方法で

+0

はい、しかし、私の質問は、1つのVMが自身を介してメソッドを呼び出すことです* *外部VMを介して*。 –

2

3.2スレッド使用。 RMI ランタイムは、リモートオブジェクト のスレッドへのマッピングのマッピングに関して保証しません。同じ リモートオブジェクト上のリモートメソッド呼び出しが同時に実行される可能性があるため、リモートオブジェクト実装 はその実装がスレッドセーフであることを確認する必要があります。最初の呼び出し元のスレッド、「ジャック」が、リモート呼び出しに結び付けられるように指定されていない、そのようにスレッドに関する保証がないことを言って、明示的にそうhttp://download.oracle.com/javase/6/docs/platform/rmi/spec/rmi-arch3.html

から

barコールを処理するときにRMIサーバによって 'A'で使用されます。

そして、Thomaszが言うように、jackが既にブロックしている、とにかく「B」からのリモート呼び出しを処理することはできないだろう。

関連する問題