0

我有一个Class名称,它Foo调用. 延伸. 里面有一个调用。现在哪个会停?实例或实例? 签名(它已定义,这是我感到困惑的主要原因):non-staticbarMethod()BarBarFiber
barMethod()park()FiberFooBar

park()static

public static void park()
                 throws SuspendExecution

如果答案是Foo(似乎是这样),我该如何停车Barsuspend (park) Bar我主要是不打算Foo
如果你给我一个关于如何停放Bar实例的答案,那么请告诉我,既然我想停放Bar,不Foo应该barMethod()SuspendExecution吗?它不会被 的任何实例访问Bar,并且我不想Foo在此方法中停放任何实例(仅限Bar)。

还请提供关于 的所有相同问题的答案unpark()。它会应用于当前FiberFoo在这种情况下为实例)还是会影响Bar实例?如果是后者,那么我怎样才能解除Bar实例,而不是Foo实例?

4

2 回答 2

0

就像线程一样,光纤只能停放自己。调用park暂停当前正在执行的纤程。定义当前方法的类是完全不相关的。因此,对于“将停放哪根光纤,Bar 或 Foo”的问题,答案是“当前正在执行的任何一根光纤”。它可以是 Bar 实例、Foo 实例或其他一些纤程。

就像 with 一样Thread,唯一Fiber值得覆盖的方法是run. 出于任何其他原因子类化Fiber(或Thread)是没有意义的。最好将纤维和线程视为完全相同的想法,以两种不同的方式实现。AThread是由操作系统实现的线程,并且Fiber是在 JVM 中实现的(轻量级)线程,但它们的行为本质上是相同的。

最后,parkandunpark是一个低级 API(就像LockSupport.park/unpark普通线程一样),除非您正在编写新的并发机制(如一种新的锁),否则您不应该直接使用它们。相反,使用任何更高级别的光纤同步 API,如通道、锁等。

于 2016-05-15T11:49:00.793 回答
-1

quasar 不鼓励直接调用 park 和 unpark

kilim 是一个类似的工具,提供 Fiber.yield(相当于 park),你可以直接运行一个任务。所以我认为它可以做你想要的

在您的示例中,barMethod 应标记为 Pausable,但调用方法不需要是

我们最近做了 kilim 2.0 的预发布。特别是,您应该查看 Continuation 类和 XorShift 示例

https://github.com/nqzero/kilim

于 2016-12-09T02:27:19.917 回答