链接承诺另一个

时间:2016-08-24 00:18:44

标签: scala promise future

我正在阅读scala.concurrent.impl.Promise并对此概念感到困惑"将DefaultPromise与另一个"链接起来。我理解'防止内存泄漏'部分,但不知道如何编写DefaultPromise的当前状态为DefaultPromise的示例。

首次创建DefaultPromise时,其状态为Nil,随着flatMap附加case dp: DefaultPromise[_] => dp.asInstanceOf[DefaultPromise[S]].linkRootOf(p) ,列表会增加。在什么情况下分支

Future.flatMap
test("default promise linking") { //f1.getState === Nil val f1 = Future {Thread.sleep(200000); 2} //f1.getState === List(CallbackRunner1) f1.flatMap(x => Future {Thread.sleep(200000); 4}) //f1.getState === List(CallbackRunner2, CallbackRunner1) f1.flatMap(y => Future {Thread.sleep(200000); 3}) Thread.sleep(30000000) } 中调用了

{{1}}

1 个答案:

答案 0 :(得分:0)

举个例子:

val f1 = Future {Thread.sleep(200000); 2}
val f2 = f1.flatMap(x => {
    val f3 = Future {Thread.sleep(200000); 4}
    f3
})

f1f3当然不会共享相同的状态 - 一个用2另一个用4解析。但是当f1完成时,处理程序(f(v))将创建f3,它将匹配您感到困惑的the case。然后,f2p中的flatMap)将与f3相关联,以便它们共享相同的状态。