我正在阅读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}}
答案 0 :(得分:0)
举个例子:
val f1 = Future {Thread.sleep(200000); 2}
val f2 = f1.flatMap(x => {
val f3 = Future {Thread.sleep(200000); 4}
f3
})
f1
和f3
当然不会共享相同的状态 - 一个用2
另一个用4
解析。但是当f1
完成时,处理程序(f(v)
)将创建f3
,它将匹配您感到困惑的the case
。然后,f2
(p
中的flatMap
)将与f3
相关联,以便它们共享相同的状态。