2016-05-12 126 views
0

我有一個名爲FooClass,它調用Barnon-static方法barMethod()Bar延伸Fiber
裏面barMethod()有一個致電park()。現在哪個Fiber將停放? Foo實例或Bar實例?的park()

簽名(其定義static,這是我的困惑的主要原因):
類星體暫停執行

public static void park() 
       throws SuspendExecution 

如果答案是Foo(這似乎是如此),我怎麼可以停Bar?我主要打算suspend (park)Bar而不是Foo
如果您向我提供關於如何停車Bar實例的答案,那麼請告訴我,因爲我想停車Bar,而不是Foo,應該barMethod()SuspendExecution?它不會被Bar的任何實例訪問,並且我不想在此方法內部駐留任何Foo實例(僅限Bar)。

請同時提供有關unpark()的所有相同問題的答案。它會被應用到當前的FiberFoo這個例子中)還是影響Bar實例?如果後者,那麼我怎麼能unpark Bar實例,而不是Foo實例?

回答

0

就像線程一樣,光纖只能停放自己。撥打park會中止當前正在執行的光纖。當前方法定義的類完全不相關。因此,關於「哪條光纖停放,Bar或Foo」這個問題的答案是「無論哪條光纖正在執行」。它可以是Bar實例,Foo實例或其他一些光纖。

就像Thread一樣,唯一的Fiber方法是值得重寫的是run。因爲任何其他原因,子類別Fiber(或Thread)是沒有意義的。如果你認爲纖維和線是完全一樣的想法,最好是用兩種不同的方法來實現。 A Thread是由OS實現的線程,而Fiber是JVM中實現的(輕量級)線程,但它們的行爲基本相同。

最後,parkunpark是一個低級別的API(就像LockSupport.park/unpark,對於普通線程做同樣的),除非你正在編寫一個新的併發機制(例如新類型的鎖),你不應該直接使用它們。取而代之的是,使用任何更高級別的纖維同步的API,像信道,鎖等。

-1

類星體阻礙主叫公園和直接取消駐留

基裏姆是一個類似的工具,它提供Fiber.yield(相當於園)你可以直接運行一個任務。所以我認爲它可以做你在找什麼

在你的榜樣

,barMethod應該被標記爲可暫停,但調用方法並不需要是

我們最近做了基裏姆2.0的預發佈。特別是你應該看Continuation類和XorShift示例

https://github.com/nqzero/kilim