0

のメソッドを呼び出すClass名前があります。伸びます。 内部には への呼び出しがあります。さて、どれが駐車されるでしょうか?インスタンスまたはインスタンス? の署名(定義されており、これが私の混乱の主な理由です):Foonon-staticbarMethod()BarBarFiber
barMethod()park()FiberFooBar

park()static

public static void park()
                 throws SuspendExecution

答えがFoo(そうらしい)の場合、どうすれば駐車できBarますか?suspend (park) Bar主にしないつもりFooです。
また、インスタンスをパークする方法について回答があれば、私はBarパークしたいのでBar、 ではなくFoobarMethod()スローする必要があることを教えてくださいSuspendExecution。のどのインスタンスからもアクセスされず、このメソッド内Barに のインスタンスをパークしたくありませんFoo(のみBar)。

に関するすべての同じ質問に対する回答も提供してくださいunpark()。現在Fiber(Fooこの場合はインスタンス) に適用されますか、それともインスタンスに影響しBarますか? Bar後者の場合、インスタンスではなくインスタンスをパーク解除するにはどうすればよいFooですか?

4

2 に答える 2

0

スレッドと同じように、ファイバーはそれ自体しかパークできません。への呼び出しparkは、現在実行中のファイバーを中断します。現在のメソッドが定義されているクラスはまったく関係ありません。したがって、「Bar または Foo のどちらのファイバーがパークされるか」という質問に対する答えは、「現在実行中のファイバー」です。これは、Bar インスタンス、Foo インスタンス、またはその他のファイバー全体である可能性があります。

と同様に、オーバーライドする価値のあるThread唯一のメソッドは です。他の理由でサブクラス化(または) しても意味がありません。ファイバーとスレッドはまったく同じアイデアであり、2 つの異なる方法で実装されていると考えるのが最善です。Aは OS によって実装されるスレッドであり、JVM に実装される (軽量) スレッドですが、どちらも基本的に同じように動作します。FiberrunFiberThreadThreadFiber

最後に、parkunparkは低レベルの API であり (LockSupport.park/unparkプレーン スレッドでも同じように)、新しい同時実行メカニズム (新しい種類のロックなど) を作成する場合を除き、それらを直接使用しないでください。代わりに、チャネル、ロックなどの高レベルのファイバー同期 API を使用してください。

于 2016-05-15T11:49:00.793 に答える