Link 对另一个人的承诺

Link promise to another

我正在阅读 scala.concurrent.impl.Promise 并且对这个概念感到困惑 "link DefaultPromise with another"。我了解 'prevent memory leak' 部分,但不知道如何编写 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 并且它将匹配您感到困惑的 the case。然后,f2p in flatMap)将链接到 f3,以便它们共享相同的状态。