把承诺与另一个联系起来



我正在阅读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
})

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

最新更新