2016-08-24 194 views
0

我在閱讀scala.concurrent.impl.Promise,並被「將DefaultPromise與另一個鏈接」概念混淆。我理解'防止內存泄漏'部分,但不知道如何編寫一個示例,其中DefaultPromise的當前狀態爲DefaultPromise將承諾鏈接到另一個

當第一次創建DefaultPromise時,其狀態爲Nil,並且該列表隨着我們繼續追加flatMap而增加。在什麼情況下分支

case dp: DefaultPromise[_] => dp.asInstanceOf[DefaultPromise[S]].linkRootOf(p) 

in Future.flatMap called?

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) 
    } 
+0

也許'f1.flatMap(x => f1)'? – Bergi

+0

@Bergi,但如何理解**鏈接承諾到另一個,所以這兩個承諾共享相同的外部可見狀態**? –

+0

'Future {Thread.sleep(200000); 4}'返回一個'DefaultPromise',對吧? – Bergi

回答

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。然後,f2pflatMap)將鏈接到f3,以便它們共享相同的狀態。

+0

我明白了,謝謝! –

+0

我在這裏寫了一篇關於這方面的文章:https://github.com/viktorklang/blog/blob/master/Futures-in-Scala-2.12-part-9.md –

+0

你能否詳細說明** ACPS * *打破承諾鏈條? ** ACPS **如何削減flatMaps之間的關聯? –