我正在阅读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)
}
举个例子:
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
,它将匹配您所困惑的case
。然后,f2
(flatMap
中的p
)将链接到f3
,以便它们共享相同的状态。