2016-05-12 22 views
0

私はnon-staticメソッドbarMethod()Barと呼ぶFooという名前のClassを持っています。 BarFiberです。
barMethod()の内部にはpark()があります。今どのFiberは駐車されますか? FooインスタンスまたはBarインスタンス?

park()の署名(これはstatic定義されており、これが私の混乱の主な理由です):
擬似サスペンド実行

public static void park() 
       throws SuspendExecution 

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

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

答えて

0

スレッドと同様に、ファイバーは自分自身をパークすることができます。 parkを呼び出すと、現在実行中のファイバーは中断されます。現在のメソッドが定義されているクラスは完全に無関係です。ですから、「どのファイバーが駐車されるのか、Bar or Foo」の質問に対する答えは、「現在実行されているファイバーのどれか」です。これは、Barインスタンス、Fooインスタンス、または他のいくつかのファイバーにすることができます。

Threadとまったく同じように、無効にする価値のあるFiberメソッドのみがrunです。その他の理由でFiber(またはThread)をサブクラス化することは意味をなさない。ファイバーとスレッドがまったく同じ考えであり、2つの異なる方法で実装されていると思うのが最善です。 A ThreadはOSによって実装されたスレッドであり、FiberはJVMに実装された(軽量)スレッドですが、どちらも本質的に同じように動作します。

最後に、parkunparkは(単なるスレッドのための同じをLockSupport.park/unparkのような)低レベルのAPIであり、あなたが(ロックの新しい種類のような)新しい同時実行メカニズムを書いている場合を除き、あなたはいけませんそれらを直接使用してください。代わりに、

-1

クエーサー公園を呼び出し、

キリムはFiber.yield(駐車する同等)を提供する同様のツールで直接unparkを阻止...チャネル、ロックなどのような、より高いレベルの繊維の同期APIのいずれかを使用タスクを直接実行できます。だから私は、barMethodがPausableとしてマークする必要があり、それはあなたがあなたの例では

探しているものを行うことができると思いますが、呼び出し元のメソッドは、我々は最近、キリム2.0のプレリリースをした

である必要はありません。 。特に、ContinuationクラスとXorShiftの例を見てください。

https://github.com/nqzero/kilim